2011-05-20 43 views
3

我有一个操作鼠标事件处理程序中的对象的画布。修改对象之后,我想触发相同Canvas的OnPaint()事件来显示(重新渲染)所做的更改。什么是正确的方法来做到这一点?它不会让我直接调用OnPaint()。另外,从某种意义上来说,是从另一个事件触发“错误”的事件,或者可能导致麻烦?在wxPython画布中强制绘制

回答

3

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

+0

张贴后,我发现并尝试了。这正是我以为我在寻找的东西。但是,当拖动我自己的一个对象时,它非常不稳定。看起来,refresh()只排队重绘事件,但这可能不会发生一段时间 - 特别是在处理鼠标移动时。好的尝试+1。 – phkahler

+0

通常,当人们提到wxPython邮件列表上的东西不连贯时,他们建议使用双缓冲来做。 –

+0

是的,我正在使用一个屏幕位图。这不是那种波涛汹涌的。即使这样,情况也是非常不连贯的。我很清楚重绘不是经常发生。没有闪烁,更新是直接的,但很少。 – phkahler

1

我试过了Mike.Driscoll建议的self.refresh()。这部分工作。我使用鼠标事件移动自己的对象,然后重新绘制图像 - 渲染我的对象。所以鼠标事件正在更新坐标,并且重绘正在更新显示。问题在于refresh()似乎被称为延迟或者比鼠标事件的优先级低。刷新()因此产生波涛汹涌的显示。

因为我使用通过wxDemo用于滚动区缓冲显示,我从Paint事件以下行:

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

而且叫我与DC绘图功能从鼠标事件处理程序中。完成后,dc被释放并且(根据演示中的注释)被复制到屏幕上。以前我不清楚Paint事件是如何处理DC的,所以我试图调用事件。事实证明,你可以使用该DC,并从鼠标事件内部渲染。这会导致我的自定义绘制对象的平滑拖动。