2010-01-11 3 views
1

Je dois dessiner sur l'image (pour commenter) dans un panneau déroulant. J'ai des problèmes avec ça car il ne se comporte pas correctement lorsque je l'agrandis. il arrête de dessiner, puis il le montre au bout d'un moment au mauvais endroit. dans le coin supérieur gauche de la fenêtre. et ne dessine pas correctement les lignes. ci-dessous est le code de la fonction (onLeftDown) (le bouton qui doit dessiner). l'événement du bouton droit (zoom avant). J'espère que c'est assez clair.Problème lors du zoom des images dans wxpython

Avez-vous une idée de ce qui se passe et comment le résoudre?
merci à l'avance

def OnLeftButtonEvent(self, event): 
    self.curLine = [] 
    self.x, self.y = event.GetPositionTuple() 
    self.CaptureMouse() 

def OnMotion(self, event): 
    if self.HasCapture() and event.Dragging(): 
     dc = wx.BufferedDC(None,self.buffer) 
     dc.SetUserScale(self.scale,self.scale) 
     # to zoom in and out (increases whenever someone presses the right mouse button 
     dc.BeginDrawing() 
     dc.SetPen(wx.Pen(wx.BLUE, 3)) 
     coords = (self.x, self.y) + event.GetPositionTuple() 
     self.curLine.append(coords) 
     dc.DrawLine(*coords) 
     self.x, self.y = event.GetPositionTuple() 
     self.SetXY(event) 
     dc.EndDrawing() 

def OnRightDown(self,event): 
    print self.scale 
    self.scale=self.scale*2.0 
    self.initDrawing() 
    self.maxHeight=self.maxHeight*2 
    self.maxWidth=self.maxWidth*2 
+0

Si le code d'origine que vous avez publié est votre code réel, l'un des problèmes que vous rencontrez est une utilisation incohérente des espaces de début. Dans OnRightDown, self.initDrawing() utilise un retrait différent de la ligne de code précédente et suivante. C'est peut-être votre problème? –

+0

non ce n'est pas le problème. il n'y a aucune erreur d'indentation mais l'indentation ici sur cette page Web est ratée. Je ne sais pas comment le réparer ici. –

+0

'self.HasCapture() et event.Dragging():' que signifie cette ligne? – SilentGhost

Répondre

3

Vous avez besoin à l'échelle des coordonnées de la souris afin qu'il soit en phase avec mise à l'échelle du dessin, donc si vous utilisez userScale = 2, souris à x = 10 se trouvera à 20 . donc vous devez faire ce

sx, sy = x/cur_scale, y/cur_scale 

Vous devez également être ne dessin dans l'événement EVT_PAINT pas onmotion, sur motion que vous avez juste besoin de rafraîchir la fenêtre et l'événement de peinture devrait prendre soin de ce que vous voulez dessiner.

+0

btw, vous n'avez pas besoin de commencer/fin dessin - ils ne font rien. (whoops, cela devrait être pour Moayyad) –

+0

En fait, le dessin est correct (il copie le code de démo wx) - le EVT_PAINT bloque simplement le tampon bitmap qui est dessiné dans les événements de mouvement. C'est le code dans l'événement de peinture de mon programme de dessin: wx.BufferedPaintDC (self, self.buffer, wx.BUFFER_VIRTUAL_AREA) –

+0

mais quand même ... cela ne répond pas à ma question, le dessin est bien mais pas quand vous utilisez DC. SetUserScale(). est-ce que tu l'as essayé ? ou quelqu'un a un autre moyen de zoomer l'image –

Questions connexes