闪烁发生在重绘窗口导致用户界面可见的闪动。甚至简单的绘制程序,如果使用不当的话,都是导致闪烁。
幸运的是有一些方法来解决和最小化闪烁,这会提高程序界面的外观和感觉。
发生闪烁时,首先尝试避免不必要的擦除。通过绑定一个空的事件处理器给EVT_ERASE_BACKGROUND事件来实现。绑定一个空事件处理器阻止系统擦除背景,当在OnPaint
中再次绘制时,将会覆盖已经存在的背景。这样在EVT_ERASE_BACKGROUND和EVT_PAINT之间,背景不会闪烁成白色。
self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnErase)
def OnErase(self, event):
# Do nothing, reduces flicker by removing
# unneeded background erasures and redraws
pass
在OnPaint中使用一个BufferedPaintDC,所有单独的绘制步骤都在屏幕之外进行,绘制完成一步到位地显示在
屏幕上。这种方法能够很好地减少闪烁,因为屏幕仅在单个变化中更新替代了不用缓冲DC直接绘制到屏幕上更新很多次。
def OnPaint(self, event):
"""Draw the image on to the panel"""
# Create a Buffered PaintDC
dc = wx.BufferedPaintDC(self)
最后一个方式是只重绘界面的一小部分。它能用在当一个控件由于某个状态变化需要手动重绘自己的一部分。比如,一个控件拥有文本和图片,如果控件有鼠标在上面改变字体颜色的行为,可以使用rect参数来指定重绘文本区域。
self.Refresh(rect=RectToUpdate)