Seite 1 von 1
Könnte Entry seine Buchstaben auch für sich behalten ?
Verfasst: Mittwoch 21. Dezember 2011, 07:22
von Georg
Mit dem Beispiel-Code sieht man im Terminal, dass Entry alle Tasten ans Eltern-Widget weiterreicht, egal ob verarbeitet ( z.B. Buchstabe ) oder nicht ( z.B. Pfeil nach oben ). Lässt sich dieses Verhalten ändern?
Code: Alles auswählen
from tkinter import *
def keyHandler( event ) :
print( event.keysym )
root = Tk()
root.bind( '<Key>', keyHandler )
button = Button( root )
button.pack( side=LEFT )
entry = Entry( root )
entry.pack( side=LEFT )
entry.focus_set()
mainloop()
Re: Könnte Entry seine Buchstaben auch für sich behalten ?
Verfasst: Mittwoch 21. Dezember 2011, 10:42
von BlackJack
@Georg: Auf welchen Ebenen man Ereignisbehandlung hinzufügen kann, in welcher Reihenfolge die aufgerufen werden, und wie man diese Kette unterbrechen kann, steht hier:
Events and Bindings.
Re: Könnte Entry seine Buchstaben auch für sich behalten ?
Verfasst: Mittwoch 21. Dezember 2011, 13:15
von Georg
Danke.
Trotzdem habe ich noch keinen Weg gefunden, die Buchstaben abzufangen, nachdem sie in Entry verarbeitet wurden.
Mit Kommentarkreuz landen sie in Entry und rootHandler, ohne Kommentarkreuz nur im entryHandler.
Code: Alles auswählen
from tkinter import *
def rootHandler( event ) :
print( 'rootHandler : {0}'.format(event.keysym))
def entryHandler( event ) :
print( 'entryHandler : {0}'.format(event.keysym))
return 'break'
root = Tk()
root.bind( '<Key>', rootHandler )
button = Button( root )
button.pack( side=LEFT )
entry = Entry( root )
entry.pack( side=LEFT )
entry.focus_set()
#entry.bind( '<Key>', entryHandler )
mainloop()
Re: Könnte Entry seine Buchstaben auch für sich behalten ?
Verfasst: Donnerstag 22. Dezember 2011, 02:12
von problembär
Ich bin nicht sicher, was Du meinst, aber könnte es im ersten Beispiel daran liegen, daß Du ".bind()" auf dem root-Widget verwendest?
Ich meine, dann kannst Du das Entry ja gleich ganz weglassen, das heißt, es hat so gar nichts mit dem Entry zu tun.
Code: Alles auswählen
from tkinter import *
def keyHandler( event ) :
print( event.keysym )
root = Tk()
root.bind('<Key>', keyHandler)
mainloop()
Wenn man die Eingaben aus dem Entry haben will, verwendet man ja normalerweise ".get()" des Entrys. Oder was willst Du machen?
Re: Könnte Entry seine Buchstaben auch für sich behalten ?
Verfasst: Donnerstag 22. Dezember 2011, 04:31
von Georg
In der Anwendung gibt es mehrere (viele) Zeilen aus Button und Entry. In den Entries werden die Eingabedaten erfasst. Die Buttons sind so beschriftet, dass (fast) alle Anfangsbuchstaben verschieden sind. Verlässt der Benutzer ein Entry mit Tab, dann kann er mit den Anfangsbuchstaben zu einem beliebigen anderen springen.
Weil nun die Entries ihre Buchstaben nicht behalten, muss ich im Toplevel jeden Buchstaben fragen, ob er aus einem Entry kommt oder nicht. Das habe ich jetzt zwar realisiert, finde ich aber seltsam.
Code: Alles auswählen
try :
event.widget.get()
except AttributeError : # not an Entry widget
target = self.fields.get( event.char, None )
if target :
target.focus_set()
else :
reportKey( self, event ) # invalid command
Re: Könnte Entry seine Buchstaben auch für sich behalten ?
Verfasst: Donnerstag 22. Dezember 2011, 09:08
von BlackJack
@Georg: Wäre es denn zu umständlich für die Nutzer noch eine zusätzliche Taste zu drücken? Für so etwas wird, zumindest unter Windows und Linux, üblicherweise die Alt-Taste verwendet. Dazu müsste man dann nicht einmal das Entry mit Tab verlassen — Du tauschst also im Grunde `Tab, Buchstabe` durch `Alt+Buchstabe` aus.
Re: Könnte Entry seine Buchstaben auch für sich behalten ?
Verfasst: Donnerstag 22. Dezember 2011, 13:01
von Georg
Ja, stimmt schon, war aber nicht meine Frage.
Re: Könnte Entry seine Buchstaben auch für sich behalten ?
Verfasst: Donnerstag 22. Dezember 2011, 21:09
von problembär
Ich denke, Tkinter bietet die Widgets mit gewissen Konventionen an, die sich ja von anderen Fenstersystemen eingebürgert haben.
Denk' nur an das Textwidget (Tkinter.Text). Wie darauf der Cursor vom Benutzer bewegt werden kann (z.B mit "Strg+Ende" zum Textende) und wie er z.B. Text markieren kann, sind vom Widget vorgegeben. Und die vorgegebenen Einstellungen sind ja auch vernünftig.
Wenn man diese etwa für ein Entry-Widget ändern will, müßte man wohl tiefer in die Mechanismen von Tkinter und Tk vordringen.
Ist wohl besser, wenn man da bei den Vorgaben bleibt. Sind die Benutzer inzwischen ja auch so daran gewöhnt.
Re: Könnte Entry seine Buchstaben auch für sich behalten ?
Verfasst: Freitag 23. Dezember 2011, 09:55
von Georg
Auch mir liegt es fern, das Verhalten von Entry ändern zu wollen. Erlaubt mir bitte, auf meine Frage zurückzukommen.
Ich bin bisher davon ausgegangen, dass die Beschreibung
http://www.manaware.net/tkinter-program ... ation.html zutrifft. Deswegen habe ich mich gewundert, dass Frames übergangen werden (
http://www.python-forum.de/viewtopic.php?f=18&t=28075), und wundere mich jetzt, dass Entry die Buchstaben weiterreicht, obwohl sie verarbeitet wurden. Ist der Artikel, von dem ich ausgegangen bin, einfach falsch?
Re: Könnte Entry seine Buchstaben auch für sich behalten ?
Verfasst: Freitag 23. Dezember 2011, 10:11
von BlackJack
@Georg: Der Artikel beschreibt nicht alle Details. Ich habe weiter oben ja schon auf das Tkinter-Buch von Effbot verwiesen. Tastenereignisse werden an das Widget mit dem Fokus gesendet: „Keyboard events are sent to the widget that currently owns the keyboard focus.“ Darunter ist ein Beispielprogramm bei dem man den `Frame` erst anklicken muss, damit die daran gebundene Behandlungsfunktion die Tasten verarbeitet.
Ob ein `Entry` die weitere Verarbeitung von Tasten weiter oben in der Hierarchie erlaubt oder nicht, kann man aus dem Artikel nicht ableiten. Unter diesem Gesichtspunkt ist er also korrekt.