2011-05-20 35 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,並從鼠標事件內部渲染。這會導致我的自定義繪製對象的平滑拖動。