next up previous contents index 6264666870
Next: 8.5 Protokolle Up: 8. Ereignisse (Events) und Previous: 8.3 Das Event-Objekt und   Contents   Index

8.4 Instanzen- und Klassenbindungen

Die bind-Methode, die wir oben benutzten, erzeugte eine Instanzenbindung. Das bedeutet: die Bindung wird nur auf ein einziges Widget angewendet. Wenn Sie neue Frames erzeugen, werden die Bindungen nicht mitvererbt. Doch es gibt eine Möglichkeit, Bindungen auf vier verschiedenen Levels vorzunehmen:

  1. Bindungen an die widget-Instanz mit Hilfe der Methode bind.
  2. Bindungen an das übergeordnete Fenster, das das widget enthält (Toplevel oder root). Hierzu dient ebenfalls bind.
  3. Bindungen an die gesamte Widget-Klasse mit Hilfe von bind_class und schliesslich
  4. die Bindung an die gesamte Anwendung mit Hilfe von bind_all.
Denken Sie zum Beispiel einmal an Programme, bei denen über die F1-Taste ein Hilfefenster geöffnet wird. In diesen Programmen ist mit bind_all die F1-Taste an die gesamte Applikation gebunden worden.

Wenn Sie mehrfache Bindungen derselben Taste vornehmen wollen, so bedenken Sie, dass Tkinter immer die naheliegendste Bindung dann auch tatsächlich ausführt. Eine Bindung der Enter-Taste durch <Return> und <Key> führt dazu, dass die erste Bindung aufgerufen wird, sobald die Enter-Taste gedrückt wurde.

Wenn eine <Return>-Bindung sowohl an ein Toplevelwidget vorgenommen wird und eine <Return>-Bindung auf der Instanzebene, werden beide Bindungen aufgerufen und zwar genau in der oben angegebenen Reihenfolge.

Manchmal gibt es dabei Verwirrungen, wenn Sie versuchen, das Standardverhalten eines Widgets abzuändern. Denken Sie zum Beispiel an Texteingabefenster. Sie möchten verhindern, dass User in ein Textfenster mehr als eine Zeile eingeben und Sie überlegen sich einen Weg, wie die RETURN-Taste ignoriert werden kann. Erst schreiben Sie sich eine Funktion

def ignore(event)

   pass

und nehmen die Bindung

text.bind('<Return>',ignore)
vor. Was passiert? Gar nichts. Der User kann die RETURN-Taste problemlos weiterhin mit Erfolg einsetzen. Was ist los? Die von Ihnen vorgenommene Bindung existierte nur auf der untersten Ebene, der Instanzebene. Das Standardverhalten ist aber an die Klassenebene gebunden! Sie können nun die Methode bind_class anstelle von bind einsetzen. Aber das würde das Verhalten aller Widgets dieser Klasse in der Anwendung verändern! Ein einfacherer Weg besteht darin, den eben geschriebenen Code zu verwenden und anstelle von pass die Funktion ignore tatsächlich etwas ausführen zu lassen, zum Beispiel mit return 'break' ein Stringobjekt zurückzugeben.

Wenn Sie tatsächlich eine Klassenbindung vornehmen wollen, schreiben Sie

top.bind_class('Text','<Return>',ignore)
in Ihren Code. Doch vermeiden Sie dies nach Möglichkeit. Schreiben Sie dann lieber eine eigene, von den Textwidgets abgeleitete Klasse, in der Sie diese Bindung vornehmen.


next up previous contents index 6264666870
Next: 8.5 Protokolle Up: 8. Ereignisse (Events) und Previous: 8.3 Das Event-Objekt und   Contents   Index
Heiko Schroeder 2003-03-23