He estado jugando en python (v3.9.10) y no he encontrado ninguna forma de leer las pulsaciones de tecla desde la tecla Intro y hacer que tkinter haga algo con esa pulsación de tecla. Estoy tratando de hacer un pequeño programa tonto para mostrar algunos números en mi pantalla para la escuela y quiero poder hacerlo rápidamente. este es mi código hasta ahora:
from tkinter import * #DEFS def submit(): submitted=entrybox.get() display.config(text=submitted) app=Tk() entrybox=Entry(width=10) entrybox.place(x=10,y=10) #display label display=Label(text=' ') display.place(x=50,y=50) display.config(font='Arial 72') #submit button subbutton=Button(text='SUBMIT',command=submit) subbutton.place(x=70,y=10)(Lo siento si mi código se ve realmente mal, soy bastante nuevo en python y todo lo que tiene para ofrecer) (También lo siento por sonar repetitivo y/o tonto. Foros como este tampoco me son familiares)
¿Hay alguna forma de leer las pulsaciones de tecla desde la tecla Intro mientras permite que el resto de mis cosas de tkinter se ejecuten según lo previsto? gracias de antemano.
Puedes usar .bind() para hacer esto así:
app.bind('<Return>', function) Esto llamará a la function cuando se presione enter. '<return>' denota la tecla regresar o ingresar, y llama a la function cuando ocurre el evento de presionar una tecla regresar.
Podrías agregarlo a tu código así:
from tkinter import * def submit(): submitted=entrybox.get() display.config(text=submitted) app=Tk() entrybox=Entry(width=10) entrybox.place(x=10,y=10) #display label display=Label(text=' ') display.place(x=50,y=50) display.config(font='Arial 72') #submit button subbutton=Button(text='SUBMIT',command=submit) subbutton.place(x=70,y=10) app.bind('<Return>', lambda x: submit()) app.mainloop()Esto hará lo que estás buscando...
Use el método bind(sequence, func) en su widget (como Button o incluso la aplicación raíz Tk ).
La sequence de parámetros es uno de los eventos predefinidos , un nombre de cadena para teclas, eventos de mouse, etc. El parámetro func es una función de devolución de llamada o controlador, dada solo por nombre (sin paréntesis ni argumentos), que debe tener un parámetro posicional para Event
Vea este ejemplo mínimo:
from tkinter import * def callback(event): print(event) def quit(): # did we miss something ? print("Escape was pressed. Quitting.. Bye!") exit() app = Tk() app.bind('<Return>', callback) # on keypress of Enter or Return key app.bind('<Enter>', callback) # on mouse-pointer entering the widget - here the app's root window (not confuse with Enter key of keyboard) app.bind('<Escape>', quit) # on keypress of Escape key app.mainloop() # to start the main loop listening for eventsImprime después de presionar las siguientes teclas:
<KeyPress event keysym=Return keycode=36 char='\r' x=-583 y=-309> Exception in Tkinter callback Traceback (most recent call last): File "/usr/lib/python3.6/tkinter/__init__.py", line 1705, in __call__ return self.func(*args) TypeError: quit() takes 0 positional arguments but 1 was givenNota:
callback de llamada) que imprime el event pasado.quit ). Pero como no tiene el parámetro requerido (como event ), la invocación falló con un TypeError . Al agregar el parámetro def quit(event): tiene éxito:
<Enter event focus=True x=6 y=188> <Enter event focus=True x=182 y=45> <KeyPress event keysym=Return keycode=36 char='\r' x=-583 y=-309> <Enter event state=Button1 focus=True x=123 y=68> Escape was pressed. Quitting.. Bye!Nota:
<Enter> es cuando el puntero del mouse ingresa al marco del widget (visible), aquí de la ventana raíz de la aplicación.<Escape> sale de la aplicación RealPython: Python GUI Programación con Tkinter es un rico tutorial para obtener más información, especialmente sobre el uso de .bind() .