Signale und Ereignisse

 

Signale und Ereignisse

Wie viele andere Bibliotheken für grafische Oberflächen arbeitet auch GTK ereignisgesteuert: Eine zentrale Warteschleife (event loop) wartet darauf, dass etwas passiert und übergibt dann die Kontrolle an die Routinen, die für die Bearbeitung des Ereignisses (event) zuständig sind.

Um Ereignisse zu bearbeiten benutzt GTK Signale: Bedienelemente und andere Objekte reagieren auf Ereignisse, indem sie entsprechende Signale auslösen. Mit diesen Signalen kann man externe Behandlungsroutinen (callbacks) verbinden, die dann immer aufgerufen werden, sobald das entsprechende Signal ausgelöst wird.

Bemerkung

Für Behandlungsroutinen ist die Benennung on_OBJEKTNAME_SIGNALNAME üblich, also z.B. on_bt_ok_pressed für das pressed-Signal des Objekts bt_ok.

Signale stellen die Verbindung zwischen der Benutzeroberfläche und der Programmlogik dar: Jede Aktion des Benutzers löst eine oder mehrere Signale aus, die Sie mit Behandlungsroutinen verbinden können, um darauf zu reagieren. Darüber hinaus werden Signal auch oft für die Verständigung von Programmteilen untereinander benutzt. Ein GTK-Programm enthält daher oft sehr viele Signal-Behandlungsroutinen.

Signale verbinden

Mit der Methode gtk.Widget.connect() können Sie eine Behandlungsroutine mit einem Signal verbinden.

Bei Benutzeroberflächen, die Sie mit Glade erstellt haben, können Sie statt dessen auch mit der Methode gtk.Builder.connect_signals() alle Behandlungsroutinen automatisch mit den entsprechenden Signalen verbinden.

Dazu müssen Sie in Glade bei den Signal-Eigenschaften des Bedienelements den Namen der Behandlungsroutine angeben.

Während eine Behandlungsroutine abgearbeitet wird, kann die zentrale Warteschleife keine Signale verarbeiten. Die Oberfläche reagiert daher nicht auf die Maus und Tastatur, und auch durch das Programm angestoßene Veränderungen der Bedienelemente werden meistens erst nach Beendigung der Routine sichtbar.

Es ist daher oft sinnvoll, in einer Behandlungsroutine die Ereignisverarbeitung von Hand anzustoßen, z.B. damit eine Fortschrittsanzeige aktualisiert wird. Dafür können Sie folgende Zeilen benutzen:

while gtk.events_pending():
      gtk.main_iteration ()

Wichtige Funktionen

gtk.main()

Startet die zentrale Warteschleife.

Diese Funktion rufen sie normalerweise auf, nachdem Sie das Hauptfenster Ihres Programms angezeigt haben.

gtk.main_quit()

Beendet die zentrale Warteschleife.

Diese Funktion rufen Sie üblicherweise in der Behandlungsroutine für das Signal delete-event des Hauptfensters Ihres Programms auf.

gtk.events_pending()
returns:True falls ein Ereignis auf die Verarbeitung wartet, andernfalls False

Prüft, ob momentan Ereignis auf die Verarbeitung warten

gtk.main_iteration(block=True)
Parameter:blockTrue, falls die Funktion warten soll, bis ein Ereignis zur Verarbeitung zur Verfügung steht

Führt eine einzige Iteration der zentralen Warteschliefe aus.

Diese Funktion rufen Sie typischerweise zusammen mit gtk.events_pending() auf, um alle anstehenden Ereignisse abzuarbeiten.

Beispiele

1
2
 def on_window1_delete_event(self, *args):
     gtk.main_quit()

Hier ist on_window1_delete_event die Behandlungsroutine für das delete-event-Signal des Fensters window1. Wird dieses Fenster entfernt (also geschlossen), soll gtk.main_quit() aufgerufen werden, um die zentrale Warteschleife und damit das Programm zu beenden.