gtk expose event generieren?

Programmierung für GNOME und GTK+, GUI-Erstellung mit Glade.
Antworten
Nko
User
Beiträge: 13
Registriert: Sonntag 19. Oktober 2008, 18:02

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ß
Benutzeravatar
Trundle
User
Beiträge: 591
Registriert: Dienstag 3. Juli 2007, 16:45

Widgets haben eine `queue_draw()`-Methode, durch die dann letzlich ein `expose`-Event ausgelöst wird.
"Der Dumme erwartet viel. Der Denkende sagt wenig." ("Herr Keuner" -- Bertolt Brecht)
Nko
User
Beiträge: 13
Registriert: Sonntag 19. Oktober 2008, 18:02

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.
Benutzeravatar
Trundle
User
Beiträge: 591
Registriert: Dienstag 3. Juli 2007, 16:45

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.
"Der Dumme erwartet viel. Der Denkende sagt wenig." ("Herr Keuner" -- Bertolt Brecht)
Nko
User
Beiträge: 13
Registriert: Sonntag 19. Oktober 2008, 18:02

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
Antworten