在wxPython画布中强制重新绘制

在wxPython画布中强制重新绘制,python,drawing,wxpython,Python,Drawing,Wxpython,我有一个画布,可以在鼠标事件处理程序中操作对象。修改对象后,我想为同一画布触发OnPaint()事件以显示(重新渲染)更改。正确的方法是什么?它不允许我直接调用OnPaint()。另外,从另一个事件触发一个事件在某种意义上是“错误”的,还是可能导致麻烦?我只需调用self.Refresh()或RefreshRect()并传递需要重新绘制的区域。我按照Mike Driscoll的建议尝试了self.Refresh()。这起了部分作用。我用鼠标事件移动我自己的对象,然后重新绘制图像-渲染我的对象。因

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

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

我按照Mike Driscoll的建议尝试了self.Refresh()。这起了部分作用。我用鼠标事件移动我自己的对象,然后重新绘制图像-渲染我的对象。因此,鼠标事件正在更新坐标,而重绘正在更新显示。问题是refresh()似乎被延迟调用,或者优先级低于鼠标事件。因此,Refresh()会产生起伏的显示

由于我正在通过wxDemo为滚动区域使用缓冲显示,因此我从Paint事件中选取了以下行:

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

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

发布后,我找到并尝试了该操作。这正是我想找的。然而,当拖动我自己的一个对象时,它是非常起伏的。refresh()似乎只对重绘事件进行排队,但这种情况可能暂时不会发生,特别是在处理鼠标移动时。好的尝试+1。通常当人们提到wxPython邮件列表中的内容不稳定时,他们建议使用双缓冲。是的,我使用的是屏幕外位图。不过也不是那么波涛汹涌。尽管如此,事情还是断断续续的。对我来说,重新粉刷似乎并不经常发生。没有闪烁,更新是即时的,但并不频繁。结果表明,闪烁是由于滚动窗口在闪烁图像之前被擦除。这可以通过抓取EVT_ERASE_后台事件而不执行任何操作来禁用。所以你毕竟有正确的答案。