2011-05-20 17 views
3

マウスイベントハンドラのオブジェクトを操作するCanvasがあります。オブジェクトを変更した後、同じキャンバスに対してOnPaint()イベントをトリガーして、変更を表示(再レンダリング)したいと考えています。これを行う正しい方法は何ですか? OnPaint()を直接コールすることはできません。また、何らかの意味で「間違っている」という別のイベントのイベントをトリガしているか、またはトラブルにつながる可能性がありますか?wxPython Canvasで強制的に再描画する

答えて

3

私はちょうどself.Refresh()またはRefreshRect()を呼び出し、再描画する必要がある領域を渡します。

+0

投稿後、私はそれを見つけて試しました。まさに私が探していたと思ったものでした。しかし、私自身のオブジェクトの1つをドラッグすると、非常に不安定になります。 refresh()は再描画イベントをキューするだけですが、それはしばらくの間、特にマウスの動きを処理している間には起こらないかもしれません。良い+1を試してみてください。 – phkahler

+0

通常、wxPythonのメーリングリストに不具合があると言われたら、ダブルバッファリングをすることをお勧めします。 –

+0

ええ、私は画面外のビットマップを使用しています。しかし、そんなに不安定ではありませんでした。物事はそれでも非常に断続的でした。再塗装が頻繁に起こっていないことは私には明らかでした。ちらつきはなく、アップデートは即時であったが、まれであった。 – phkahler

1

私は、Mike Driscollの提案したように、self.refresh()を試しました。それは部分的に働いた。マウスイベントで自分のオブジェクトを移動してから、イメージを再描画してオブジェクトをレンダリングします。そこで、マウスイベントは座標を更新し、再描画はディスプレイを更新していました。問題は、refresh()が遅れて呼び出されたり、マウスイベントより優先度が低いように見えることです。したがって、Refresh()は不安定な表示を生成します。

私がスクロールエリアのためwxDemoを経由してバッファリングディスプレイを使用しておりますので、私はPaintイベントから次の行を取った:

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

を、マウスイベントハンドラ内からそのDCとの私の描画機能と呼ばれます。完了時にdcが解放され、(デモのコメントに従って)画面にコピーされます。ペイントイベントがどのようにDCを処理していたかは以前は分かりませんでしたので、私はイベントを呼び出そうとしていました。そのDCを使用し、マウスイベントの内部からレンダリングすることができます。これにより、私のカスタム描画オブジェクトのスムーズなドラッグが可能になります。

関連する問題