在wxPython Canvas中强制重绘

时间:2011-05-20 18:11:06

标签: python drawing wxpython

我有一个Canvas来操纵鼠标事件处理程序中的对象。修改对象后,我想触发相同Canvas的OnPaint()事件来显示(重新渲染)更改。这样做的正确方法是什么?它不允许我直接调用OnPaint()。另外,在某种意义上触发另一个事件“错误”的事件,或者可能导致麻烦?

2 个答案:

答案 0 :(得分:3)

我只需调用self.Refresh()或者调用RefreshRect()并传递需要重新绘制的区域。

答案 1 :(得分:1)

我按照Mike Driscoll的建议尝试了self.refresh()。这部分奏效了。我正在使用鼠标事件移动自己的对象,然后重新绘制图像 - 渲染我的对象。因此,鼠标事件正在更新坐标,重新绘制正在更新显示。问题是refresh()似乎被懒惰地调用或者具有比鼠标事件更低的优先级。因此,Refresh()会产生不稳定的显示。

由于我通过wxDemo for Scrolled Area使用缓冲显示,因此我从Paint事件中获取了以下一行:

dc = wx.BufferedPaintDC(self, self.buffer, wx.BUFFER_VIRTUAL_AREA)

并在鼠标事件处理程序中使用该DC调用我的绘图函数。完成后,将释放dc并将(根据演示中的注释)复制到屏幕上。之前我不清楚Paint事件是如何处理DC的,因此我试图调用该事件。事实证明,您可以使用该DC并从鼠标事件内部进行渲染。这样可以平滑拖动自定义绘制的对象。