如何(正确)将self.Refresh()与屏幕刷新同步以避免图形闪烁?

时间:2019-04-04 10:45:16

标签: python wxpython

我正在尝试为2d对象(作为路径绘制)设置动画,因此需要重新绘制它。重绘而不闪烁的最佳方法是什么?

在调用onIdle-Event时用self.Refresh()重绘了它,然后我使用了一个固定时间的计时器来调用self.Refresh(),这种方法效果更好。但仍然有物体闪烁的问题。

import wx
import math
import time

class ObjectDrawer(wx.Frame):

    def __init__(self, *args, **kw):
        # Initialize vars
        self.dc = None
        self.gc = None
        self.lastTime = time.time()
        super(ObjectDrawer, self).__init__(*args, **kw)
        self.InitUI()

    def InitUI(self):
        self.timer = wx.Timer(self)
        # Initialize the GUI
        self.Bind(wx.EVT_PAINT, self.OnPaint)
        self.Bind(wx.EVT_TIMER, self.evt_timer)
        self.ShowFullScreen(True)
        self.SetBackgroundColour('white')

    def evt_timer(self, event):
        self.Refresh()

    def drawObjects(self):
        path = self.gc.CreatePath()
        #Add Something to the path e.g. a circle
        path.AddCircle(100,100,50)
        self.gc.StrokePath(path)
        path = None

    def OnPaint(self, e):
        dc = wx.PaintDC(self)
        self.gc = wx.GraphicsContext.Create(dc)
        self.gc.SetPen(wx.Pen('#e8b100', 5, wx.LONG_DASH))
        self.drawObjects()
        self.timer.Start(1000/60)


app = wx.App()
window = ObjectDrawer(None)
window.Show()
app.MainLoop()

1 个答案:

答案 0 :(得分:0)

如果将self.Refresh()设置为self.Refresh(False),则闪烁消失。您也可以使用wx.AutoBufferedPaintDC代替wx.PaintDC。看看wxpython Wiki中的example,了解更复杂的示例。