



Next: 8.5 Protokolle
Up: 8. Ereignisse (Events) und
Previous: 8.3 Das Event-Objekt und
Contents
Index
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:
- Bindungen an die widget-Instanz mit Hilfe der Methode bind.
- Bindungen an das übergeordnete Fenster, das das widget enthält (Toplevel
oder root). Hierzu dient ebenfalls bind.
- Bindungen an die gesamte Widget-Klasse mit Hilfe von bind_class
und schliesslich
- 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: 8.5 Protokolle
Up: 8. Ereignisse (Events) und
Previous: 8.3 Das Event-Objekt und
Contents
Index
Heiko Schroeder
2003-03-23