2010-02-27 2 views
1

Простая кривая в этом приложении появляется только тогда, когда она перетаскивается с экрана или изменяется размер окна. Когда приложение просто запускается, оно не появляется, и когда окно максимизируется или минимизируется, оно также исчезает. Тем не менее, все эти времена, «Path Drawn» напечатаны, поэтому все функции рисования вызываются. Есть ли что-то, что я делаю неправильно в отношении создания и рисования графического контекста? Если нет, как я могу сделать окно полностью обновленным в этих особых случаях?GraphicsPath не всегда обновляет себя

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() 

ответ

2

Закомментируйте self.SetDoubleBuffered(True) часть, и она будет работать, потому что из-за ошибка http://trac.wxwidgets.org/ticket/11138 окно не обновляется правильно, если SetDoubleBuffered и GraphicsContext используются вместе.

Если вам необходимо использовать двойную буферизацию, сделайте это сами, например. сначала нарисуйте MeomryDC, а затем blit или paint bitmap, чтобы нарисовать dc.

Смежные вопросы