J'ai une structure de l'interface utilisateur comme ceci:
1x HorizontalBox -> 8 x VerticalBox -> 2x Section (GObject) -> 1x RectangleWidget (gtk.DrawingArea)force PyGtk principale de redessiner
Ceci est simplement une table de 16 rectangles de cairo en deux rangs.
Le widget rectangle cairo lui-même est une sous-classe de gtk.DrawingArea et possède un exposer-handler. Je ai maintenant réécrit le programme, la structure de données et l'interface utilisateur sont maintenant complètement séparés. Un thread s'exécute en arrière-plan, mettant à jour les structures de données. En fornt de l'interface utilisateur gobject.threads_init()
est appelée. Après un délai de 100ms gobject.timeout_add(100, self.update_widget)
le principal émet un signal, qui est seulement reçu par le premier widget.
Voici l'exposé-gestionnaire:
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
#_____________________________________________________________________
Note:
Si je réduis et restaurer la fenêtre, les widgets reçoivent le gsignal et obtenir mis à jour.
J'ai essayé différentes approches. Y compris le filetage, la signalisation différente ... Toutes les approches conduisent au même comportement décrit ci-dessus.
Comment puis-je forcer le gtk.main à retourner et redessiner les autres widgets?