Könnte Entry seine Buchstaben auch für sich behalten ?

Fragen zu Tkinter.
Antworten
Georg
User
Beiträge: 18
Registriert: Mittwoch 29. August 2007, 17:01

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()
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.
Georg
User
Beiträge: 18
Registriert: Mittwoch 29. August 2007, 17:01

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()
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?
Georg
User
Beiträge: 18
Registriert: Mittwoch 29. August 2007, 17:01

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
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.
Georg
User
Beiträge: 18
Registriert: Mittwoch 29. August 2007, 17:01

Ja, stimmt schon, war aber nicht meine Frage.
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.
Georg
User
Beiträge: 18
Registriert: Mittwoch 29. August 2007, 17:01

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?
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.
Antworten