Button mit Enter aktivieren

Fragen zu Tkinter.
Antworten
WvonRiedi
User
Beiträge: 36
Registriert: Mittwoch 20. Januar 2021, 20:46

Ich möchte mit der Entertaste Buttons aktivieren.
Ich habe folgenden Code geschrieben.

Code: Alles auswählen

import tkinter
from functools import partial

fenster = tkinter.Tk()

def onReturn(num):
    
    if num == "1" :
        print ("Taste: 1")
        print(num)
        
    elif num == "2":
        print ("Taste: 2")
        print(num)
        
    elif num == "3":
        print ("Taste: 3")
        print(num)
    
    else:
        print ("Taste: ")
        print(num)

button = tkinter.Button(fenster, text='Taste 1', command=partial(onReturn,"1"))
button_1 = tkinter.Button(fenster, text='Taste 2', command=partial(onReturn,"2"))
button_2 = tkinter.Button(fenster, text='Taste 3', command=partial(onReturn,"3"))

button.pack()
button_1.pack()
button_2.pack()
fenster.bind('<Return>', onReturn)

tkinter.mainloop()
Wenn ich die Button's mit der Maus aktiviere klappt es wie gerne möchte:
Dann erscheint die Richtige Ausgabe
Taste: 1
1
Taste: 2
2
Taste: 3
3
Jedoch mit der Enter Taste:
Taste:
<KeyPress event state=Mod1|0x40000 keysym=Return keycode=13 char='\r' x=18 y=39>
Taste:
<KeyPress event state=Mod1|0x40000 keysym=Return keycode=13 char='\r' x=454 y=149>
Taste:
<KeyPress event state=Mod1|0x40000 keysym=Return keycode=13 char='\r' x=454 y=123>

Warum übergibt die Entertaste nicht auch num ?

Gruss Werner
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Nur weil Du ein Argument `num` nennst, wird das nicht automatisch zu irgendeiner Nummer. Ein Bind-Callback erwartet ein event-Argument, und das bekommst Du auch.

Was möchtest Du denn bei der Enter-Taste machen?
WvonRiedi
User
Beiträge: 36
Registriert: Mittwoch 20. Januar 2021, 20:46

Ich habe drei Buttons welche ich mit der Tabulatortaste aktivere. Mit Enter möchte ich die Aktion hinter dem Butten auslösen. Das geht ja soweit, nur kann ich bis jetzt nur eine Aktion durch die Entertaste auslösen.

Früher als ich noch mit VisualBasic kleine Programme schrieb, war der Mausklick gleichbeteutend der Entertaste. (Auch heute schreibe ich nur kleine Programme für privaten gebrauch)
Gruss Werner
__deets__
User
Beiträge: 14528
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du musst auch bei jedem einzelnen Button das Enter-Event binden, an die gleiche mit partial gebundene Funktion. Du wirst ausserdem noch das Event-Objekt wegignorieren muessen. Also zb sowas (ungetestet, und nicht besonders elegant):

Code: Alles auswählen

button_1.bind("<Return>", lambda event: partial(onButton, "1")())
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Statt der Enter-Taste mußt Du die Leertaste benutzen. Dazu brauchst Du kein bind.
Benutzeravatar
__blackjack__
User
Beiträge: 13077
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Falls es doch Return sein soll, würde ich eher schauen das Return-Event generell an Buttons zu binden (`bind_class()` oder so…) und als Aktion deren `invoke()`-Methode aufzurufen, also die vom im `event`-Argument übergebenen Widget. `invoke()` sorgt dann automatisch dafür das `command` vom betroffenen Button auszuführen.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
WvonRiedi
User
Beiträge: 36
Registriert: Mittwoch 20. Januar 2021, 20:46

Sirius3 hat geschrieben: Freitag 29. Oktober 2021, 13:50 Statt der Enter-Taste mußt Du die Leertaste benutzen. Dazu brauchst Du kein bind.
Das ist die einfachste Lösung. Herzlichen Dank
Antworten