我有这样的 UI 结构:
1x HorizontalBox -> 8x VerticalBox -> 2x Section(GObject) -> 1x RectangleWidget(gtk.DrawingArea)
这只是一个两行 16 个 cairo 矩形的表格。
cairo 矩形部件本身是 gtk.DrawingArea 的子类,并且有一个暴露处理程序。
我现在重写了程序,数据结构和UI现在完全分开了。有一个线程在后台运行,更新数据结构。在 UI的前端gobject.threads_init()
被调用。在 100 毫秒超时后gobject.timeout_add(100, self.update_widget)
,主程序发出一个信号,该信号仅由第一个小部件接收。
这里是暴露处理程序:
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 返回并重绘其他小部件?