2010-02-27 7 views
1

La courbe simple de cette application apparaît uniquement lorsqu'elle est retirée de l'écran ou si la fenêtre est redimensionnée. Lorsque l'application démarre, elle n'apparaît pas et lorsque la fenêtre est agrandie ou réduite, elle disparaît également. Cependant, toutes ces fois, "Chemin dessiné" est imprimé, de sorte que toutes les fonctions de peinture sont appelées. Y at-il quelque chose que je fais mal en ce qui concerne la création et le dessin sur le graphismecontext? Si non, comment puis-je rendre la fenêtre totalement rafraîchissante dans ces cas particuliers?GraphicsPath ne s'actualise pas toujours lui-même

import wx 

class Path(object): 
    def paint(self,gc): 
     print "Path Drawn" 
     gc.SetPen(wx.Pen("#000000",1)) 
     path=gc.CreatePath() 
     path.MoveToPoint(wx.Point2D(10,10)) 
     path.AddCurveToPoint(wx.Point2D(10,50), 
          wx.Point2D(10,150), 
          wx.Point2D(100,100)) 
     gc.DrawPath(path) 


class TestPane(wx.Panel): 
    def __init__(self,parent=None,id=-1): 
     wx.Panel.__init__(self,parent,id,style=wx.TAB_TRAVERSAL) 
     self.SetBackgroundColour("#FFFFFF") 
     self.Bind(wx.EVT_PAINT,self.onPaint) 
     self.SetDoubleBuffered(True) 
     self.path=Path() 

    def onPaint(self, event): 
     event.Skip() 

     dc=wx.PaintDC(self) 
     dc.BeginDrawing() 
     gc = wx.GraphicsContext.Create(dc) 

     gc.PushState() 
     self.path.paint(gc) 
     gc.PopState() 
     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=TestPane(self,-1) 

     self.Show(True) 


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

Répondre

2

Commentez la partie self.SetDoubleBuffered(True) et cela va fonctionner, car à cause du bug http://trac.wxwidgets.org/ticket/11138 fenêtre n'est pas rafraîchi correctement si SetDoubleBuffered et GraphicsContext sont utilisés ensemble.

Si vous DEVEZ avoir besoin de double mise en mémoire tampon, mettez-le en œuvre par ex. dessinez d'abord dans un MeomryDC puis blit ou peignez un bitmap pour peindre en continu.

Questions connexes