我有一個UI結構是這樣的:
1X HorizontalBox - > 8倍速VerticalBox - > 2X科(GObject的) - > 1X RectangleWidget(gtk.DrawingArea)力PyGTK的主要重繪
這僅僅是一個表兩排16個開羅矩形。
cairo矩形窗口小部件本身是gtk.DrawingArea的子類並具有一個公開處理程序。
我現在重寫了程序,數據結構和UI現在完全分開了。有一個線程在後臺運行,更新數據結構。在沒有UI gobject.threads_init()
被調用。在100ms的超時之後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返回並重繪其他小部件?