强制在wxPython画布中重新绘制

4

我有一个Canvas,它在鼠标事件处理程序中操作对象。修改完对象后,我想触发同一个Canvas的OnPaint()事件以显示(重新渲染)更改内容。正确的方法是什么?直接调用OnPaint()不起作用。此外,从另一个事件触发事件是否“错误”或可能导致问题?

2个回答

4
我会直接调用self.Refresh()或者RefreshRect()函数,并传入需要重绘的区域。

发布后,我找到并尝试了一下。它正是我想要的东西。然而,当拖动我的一个对象时,它非常卡顿。似乎refresh()只排队重绘事件,但可能要等一段时间才会发生 - 特别是在处理鼠标移动时。不错的尝试+1。 - phkahler
通常当人们在wxPython邮件列表中提到某些东西变得不流畅时,他们会建议使用双缓冲来解决。 - Mike Driscoll
是的,我正在使用屏幕外位图。但它并不是那种卡顿。即使使用了屏幕外位图,事情仍然非常间歇性。对我来说很明显,重绘并没有经常发生。没有闪烁,更新是立即的但不频繁的。 - phkahler
1
结果发现闪烁是由于在 blitting 图像之前擦除了 scrolledwindow。可以通过获取 EVT_ERASE_BACKGROUND 事件并在其中不执行任何操作来禁用它。因此,你终于得到了正确的答案。 - phkahler

1

我尝试了Mike Driscoll建议的self.refresh()。那部分地起作用了。我使用鼠标事件移动自己的对象,然后重新绘制图像-渲染我的对象。因此,鼠标事件更新坐标,repaint更新显示。问题在于refresh()似乎是惰性调用或者优先级低于鼠标事件。因此,refresh()会产生不流畅的显示。

由于我正在使用wxDemo for Scrolled Area的缓冲显示,所以我从Paint事件中取出了以下行:

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接