Seite 1 von 1

gtk expose event generieren?

Verfasst: Freitag 14. November 2008, 15:53
von Nko
Hallo zusammen,

ich bin gerade dabei mich in Python Grafikbibliotheken einzuarbeiten und komm nicht ganz klar mit der event-Logik. Ich hoffe, mir kann jemand nachhelfen. Es geht um animierte Grafiken. Man könnte auch "Filme" sagen.

Ich habe also das Programm framework.py von http://www.tortall.net/mu/wiki/PyGTKCai ... ork.py?raw geladen (bzw. die netten Gesichter von der gleichen Seite). Ich dachte mir ich mach's mir mal nicht zu schwer und hab einfach eine Funktion an den timer gebunden:

Code: Alles auswählen

gobject.timeout_add(int(1./fps*1000.),widget.update_widget)
Das funktioniert auch noch ganz toll. Jetzt würde ich gern aus dieser Funktion heraus die gtk.DrawingArea neu zeichnen, komme aber mit den events nicht klar. Erst dachte ich, man kann einfach:

Code: Alles auswählen

widget.do_expose_event()

aufrufen, aber mit welchem event? Dann habe ich versucht, den event direkt zu "provozieren".

Code: Alles auswählen

gtk.gdk.Event
oder

Code: Alles auswählen

gtk.gdk.Event.put
Aber so geht das anscheinend auch nicht. Oder ich weiß einfach nur nicht, welchen Parameter ich diesen Funktionen liefern muß.

Was ist der entscheidende Tip? Kann ja nicht so schwer sein.

Danke,
Gruß

Verfasst: Freitag 14. November 2008, 16:02
von Trundle
Widgets haben eine `queue_draw()`-Methode, durch die dann letzlich ein `expose`-Event ausgelöst wird.

Verfasst: Samstag 15. November 2008, 21:53
von Nko
ueppa! danke, so gehts.

Hab queue_draw aus update_widget heraus aufgerufen und voila.

Was ich allerdings nicht verstehe ist, warum man nicht queue_draw direkt an den Timer binden kann. Hat bei mir jedenfalls nicht funktioniert.

Verfasst: Samstag 15. November 2008, 22:15
von Trundle
Wenn mit "Timer" `gobject.timeout_add()` gemeint ist: weil die Callback-Funktion nur solange aufgerufen wird, wie sie den Wahrheitswert wahr zurückgibt, was `queue_draw()` nicht tut.

Verfasst: Samstag 15. November 2008, 22:20
von Nko
Ja, `gobject.timeout_add()` meine ich. Und wo Du's sagst fällt mir wieder ein, daß meine Funktion am Anfang 'True' auch nicht zurückgab und es deshalb auch nicht funktionierte.

Gut, Danke nochmal