4

データ視覚化用の小さなツールを作成しています。GUI は Pygtk で作成されており、非常にシンプルです。ユーザーがファイル名を入力した後、「計算」ボタンを押して出力を確認できます。出力は pycairo によってレンダリングされ、gtk.DrawingArea に表示されます。

アプリケーションは次のように動作します。 ボタンが押されると、ファイルが処理され、そのコンテンツが特別なクラスに保存されます。このクラスはカスタム コンテナーです。GUI と共にインスタンス化され、空または塗りつぶされます。DrawingArea の公開イベントは、コンテナーを読み取ってそのコンテンツを描画する描画関数にリンクされています。コンテナーが空である限り、DrawingArea は空のままですが、calc がクリックされてファイルが読み込まれた後、DrawingArea はビジュアルで満たされるはずです。

問題は次のとおりです。 DrawingArea の更新を除いて、すべて正常に動作します。手動で公開を呼び出す方法がわかりません。calc を押した後、ウィンドウのサイズを変更して結果を確認する必要があります。

より具体的には、チュートリアルからこのコードをコピーしましたが、パラメーター イベントを自分で提供する方法がわかりません。

def do_expose_event(self,event):
    # Create the cairo context
    cr = self.window.cairo_create()

    # Restrict Cairo to the exposed area; avoid extra work
    cr.rectangle(event.area.x, event.area.y,
            event.area.width, event.area.height)
    cr.clip()

    self.draw(cr, *self.window.get_size())
4

3 に答える 3

13

ウィジェットを更新するには、再描画する必要があることを GTK+ に伝える必要があります。通常はgtk.Widget.queue_draw()(as と呼ばれるself.queue_draw()) を使用します。これにより、ウィジェット全体が無効になり、プログラムが戻った後に行われる再描画 (公開イベントを発行することによって) がスケジュールされます。メインループへ。

再描画される領域をさらに制御する必要がある場合は、いつでも を使用gtk.Widget.queue_draw_area()して、無効にする領域を指定するか、 まで下げることができgtk.gdk.Window.invalidate_rect()ます。

于 2012-01-06T01:31:51.810 に答える
0

calc ハンドラーから呼び出しself.draw()て、偽のイベント構造を作成して公開することを忘れてください。

しかし、直接呼び出して誤用do_expose_event()することを主張する場合は、イベント構造全体を作成する必要はありません。参照する 1 つの要素 (event.area) をウィンドウ ジオメトリに設定して呼び出すだけで、何もクリップされません。

于 2012-01-05T19:57:52.280 に答える
0

オブジェクトのメソッドで、exposeイベントに接続する必要があるイベント コールバックを作成しました。self.connect("do_expose_event", self.expose)__init__

于 2012-01-05T16:05:44.313 に答える