私は次のようなUI構造を持っています:
1x水平ボックス->8x垂直ボックス->2xセクション(GObject)-> 1x RectangleWidget(gtk.DrawingArea)
これは、2行に16個のカイロ長方形のテーブルです。
cairo長方形ウィジェット自体は、gtk.DrawingAreaのサブクラスであり、expose-handlerを備えています。
プログラムを書き直したところ、データ構造とUIが完全に分離されました。バックグラウンドで実行されているスレッドがあり、データ構造を更新しています。UIのforntでgobject.threads_init()
呼び出されます。100msgobject.timeout_add(100, self.update_widget)
のタイムアウト後、メインは信号を発信しますが、これは最初のウィジェットでのみ受信されます。
ここでexpose-handler:
def OnDraw(self, widget, event):
# self.window / widget.window works both
ctx = widget.window.cairo_create()
ctx.save()
rect = self.get_allocation()
ctx.rectangle(50, 0, 30, rect.height)
ctx.set_source_rgb(*self._BACKGROUND_RGB)
ctx.fill()
ctx.rectangle(0, rect.height * (1. - self.section.GetLevel()), rect.width, rect.height)
ctx.clip()
ctx.set_source_surface(self.source, 0, 0)
ctx.paint()
ctx.restore()
return False
#_____________________________________________________________________
def update_widget(self):
rect = self.get_allocation()
self.window.invalidate_rect(rect, False)
while gtk.events_pending():
gtk.main_iteration(False)
return True
#_____________________________________________________________________
注:
ウィンドウを最小化して復元すると、ウィジェットはgsignalを受信し、更新されます。
私はさまざまなアプローチを試しました。スレッド化、異なるシグナリングを含む...すべてのアプローチは、上記と同じ動作につながります。
gtk.mainに他のウィジェットを返して再描画させるにはどうすればよいですか?