强制重绘 wxPython 画布

4 投票
2 回答
3877 浏览
提问于 2025-04-16 18:02

我有一个画布(Canvas),它在鼠标事件处理程序中操作一些对象。在我修改了这些对象之后,我想让画布重新绘制一下,以显示这些变化。请问该怎么做呢?我不能直接调用 OnPaint() 方法。另外,从一个事件触发另一个事件,这样做算不算“错误”,或者会不会引发什么问题呢?

2 个回答

1

我试着按照Mike Driscoll的建议使用self.refresh(),这部分有效。我是通过鼠标事件来移动自己的对象,然后重新绘制图像,也就是渲染我的对象。所以鼠标事件在更新坐标,而重新绘制则在更新显示。问题是,refresh()的调用似乎是懒惰的,或者优先级低于鼠标事件。因此,refresh()导致显示效果不流畅。

因为我通过wxDemo的滚动区域使用了缓冲显示,我从绘制事件中提取了以下代码:

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

然后在鼠标事件处理程序中使用这个DC调用我的绘图函数。完成后,dc会被释放,并且(根据演示中的评论)会被复制到屏幕上。之前我不太清楚绘制事件是如何处理DC的,所以我试图调用这个事件。结果发现,你可以直接使用这个DC,并在鼠标事件中进行渲染。这样就能实现我自定义绘制对象的平滑拖动。

4

我会直接调用 self.Refresh(),或者用 RefreshRect() 方法,并传入需要重新绘制的区域。

撰写回答