2010-02-14 4 views
0

wxPython - PaintDC non rafraîchissant

import wx 

class TestDraw(wx.Panel): 
    def __init__(self,parent=None,id=-1): 
     wx.Panel.__init__(self,parent,id) 
     self.SetBackgroundColour("#FFFFFF") 
     self.Bind(wx.EVT_PAINT,self.onPaint) 
    def onPaint(self, event): 
     event.Skip() 

     dc=wx.PaintDC(self) 
     dc.BeginDrawing() 
     width=dc.GetSize()[0] 
     height=dc.GetSize()[1] 
     if height<width: 
      self.drawTestRects(dc) 
     else: 
      dc.Clear() 
     dc.EndDrawing() 

    def drawTestRects(self,dc): 
     dc.SetBrush(wx.Brush("#000000",style=wx.SOLID)) 
     dc.DrawRectangle(50,50,50,50) 
     dc.DrawRectangle(100,100,100,100) 

class TestFrame(wx.Frame): 
    def __init__(self, parent, title): 
     wx.Frame.__init__(self, parent, title=title, size=(640,480)) 
     self.mainPanel=TestDraw(self,-1) 

     self.Show(True) 


app = wx.App(False) 
frame = TestFrame(None,"Test App") 
app.MainLoop() 

Ce code ne doit dessiner les rectangles de test que lorsque la hauteur est inférieure à la largeur, sinon la fenêtre doit rester vide. Toutefois, si vous modifiez le redimensionnement de la fenêtre, le panneau n'est pas redessiné à moins qu'il ne soit déplacé hors de la fenêtre. Qu'est-ce que je fais mal?

Répondre

2

Vous pouvez lier une méthode pour gérer wx.EVT_SIZE ou le panneau et l'invalider à cet endroit. Vous pouvez également utiliser le wx.FULL_REPAINT_ON_RESIZE pour le panneau.

+0

Sur le gestionnaire wx.EVT_SIZE, appelez 'self.Refresh()'. –

0

La documentation pour un SizeEvent indique qu'il peut y avoir quelques complications lors du dessin dépend des dimensions de la fenêtre. Je ne sais pas exactement ce qui se passe dans les coulisses. J'ai suivi la suggestion sur le lien et ajouté l'appel self.Refresh() au sommet de onPaint() et cela semble donner le comportement souhaité. Voir la réponse de Mghie pour un exemple plus efficace de code de travail.

+0

De cette façon, chaque action de peinture provoque un nouveau. Avez-vous 100% de charge de processeur? – mghie

+0

Non, mais je ne devrais pas avoir besoin de relancer un événement de peinture. : P (il suffit de lire le document pour wx.Window.Refresh() et vu qu'il lance un événement paint, aussi). J'essayais plutôt de montrer dans la direction pourquoi cela se produisait. –

Questions connexes