import wx

class MainFrame(wx.Frame):
    def __init__(self,parent,title):

        wx.Frame.__init__(self, parent, title=title, size=(640,480))
        self.mainPanel=DoubleBufferTest(self,-1)

        self.Show(True)

class DoubleBufferTest(wx.Panel):
    def __init__(self,parent=None,id=-1):
        wx.Panel.__init__(self,parent,id,style=wx.FULL_REPAINT_ON_RESIZE)

        self.SetBackgroundColour("#FFFFFF")

        self.timer = wx.Timer(self)
        self.timer.Start(100)
        self.Bind(wx.EVT_TIMER, self.update, self.timer)
        self.Bind(wx.EVT_PAINT,self.onPaint)


    def onPaint(self,event):
        event.Skip()
        dc = wx.MemoryDC()
        dc.SelectObject(wx.EmptyBitmap(640, 480))
        gc = wx.GraphicsContext.Create(dc)
        gc.PushState()
        gc.SetBrush(wx.Brush("#CFCFCF"))
        bgRect=gc.CreatePath()
        bgRect.AddRectangle(0,0,640,480)
        gc.FillPath(bgRect)
        gc.PopState()

        dc2=wx.PaintDC(self)
        dc2.Blit(0,0,640,480,dc,0,0)
    def update(self,event):
        self.Refresh()

app = wx.App(False)
f=MainFrame(None,"Test")
app.MainLoop()


我想出了这段代码来将双缓冲的GraphicsContext内容绘制到面板上,但是整个窗口始终闪烁。我尝试了不同的路径,例如直线和曲线,但是它仍然存在,而且我不知道是什么原因造成的。

最佳答案

之所以会闪烁,是因为每个Refresh()都会导致背景在调用onPaint之前被擦除。您需要绑定到EVT_ERASE_BACKGROUND并将其设为无操作。

class DoubleBufferTest(wx.Panel):
    def __init__(self,parent=None,id=-1):
        # ... existing code ...
        self.Bind(wx.EVT_ERASE_BACKGROUND, self.onErase)
    def onErase(self, event):
        pass
    # ... existing code ...

关于python - 为什么缓冲的GraphicsContext应用程序出现闪烁的问题?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2452012/

10-13 08:16