tecla tablas python python-3.x tkinter key-bindings

python - tecla - tablas en tkinter



¿Cómo puedo vincular la tecla enter a una función en tkinter? (2)

Soy un principiante de Python, que se ejecuta en MacOS.

Estoy haciendo un programa con una GUI de analizador de texto en tkinter, donde escribe un comando en un widget de Entry y pulsa en un widget de Button , que activa la función parse() , ect, imprimiendo los resultados en un widget de Text , texto Estilo de aventura.

> Evitar el botón

No puedo dejar que hagas eso, Dave.

Estoy tratando de encontrar una manera de deshacerme de la necesidad de arrastrar el mouse hacia el Button cada vez que el usuario emite un comando, pero esto resultó más difícil de lo que pensaba.

Supongo que el código correcto se ve como self.bind(''<Return>'', self.parse()) ? Pero ni siquiera sé dónde ponerlo. root , __init__ , parse() , y create_widgets() no lo quieren.

Para que quede claro, la única razón por la que alguien debe presionar Enter en el progreso es activar parse() , por lo que no es necesario que se incorpore específicamente al widget Entry . En cualquier lugar que funcione está bien.

En respuesta a 7stud, el formato básico:

from tkinter import * import tkinter.font, random, re class Application(Frame): def __init__(self, master): Frame.__init__(self, master, ...) self.grid() self.create_widgets() self.start() def parse(self): ... def create_widgets(self): ... self.submit = Button(self, text= "Submit Command.", command= self.parse, ...) self.submit.grid(...) root = Tk() root.bind(''<Return>'', self.parse) app = Application(root) root.mainloop()


Intenta ejecutar el siguiente programa. Solo debe asegurarse de que su ventana tenga el enfoque cuando presione Retorno: para asegurarse de que lo haga, primero haga clic en el botón un par de veces hasta que vea algo de salida, luego, sin hacer clic en ningún otro lugar, presione Retorno.

import tkinter as tk root = tk.Tk() root.geometry("300x200") def func(event): print("You hit return.") root.bind(''<Return>'', func) def onclick(): print("You clicked the button") button = tk.Button(root, text="click me", command=onclick) button.pack() root.mainloop()

Luego, solo tiene que ajustar un poco las cosas al hacer button click el button click y al hitting Return llamar a la misma función, ya que la función de comando debe ser una función que no acepta argumentos, mientras que la función de enlace debe ser una función que tome un argumento (el objeto del evento):

import tkinter as tk root = tk.Tk() root.geometry("300x200") def func(event): print("You hit return.") def onclick(event=None): print("You clicked the button") root.bind(''<Return>'', onclick) button = tk.Button(root, text="click me", command=onclick) button.pack() root.mainloop()

O bien, puede simplemente renunciar al uso del argumento de comando del botón y, en su lugar, usar bind () para adjuntar la función onclick al botón, lo que significa que la función debe tomar un argumento, al igual que con Retorno:

import tkinter as tk root = tk.Tk() root.geometry("300x200") def func(event): print("You hit return.") def onclick(event): print("You clicked the button") root.bind(''<Return>'', onclick) button = tk.Button(root, text="click me") button.bind(''<Button-1>'', onclick) button.pack() root.mainloop()

Aquí está en un entorno de clase:

import tkinter as tk class Application(tk.Frame): def __init__(self): self.root = tk.Tk() self.root.geometry("300x200") tk.Frame.__init__(self, self.root) self.create_widgets() def create_widgets(self): self.root.bind(''<Return>'', self.parse) self.grid() self.submit = tk.Button(self, text="Submit") self.submit.bind(''<Button-1>'', self.parse) self.submit.grid() def parse(self, event): print("You clicked?") def start(self): self.root.mainloop() Application().start()


Otra alternativa es usar un lambda:

ent.bind("<Return>", (lambda event: name_of_function()))

Código completo:

from tkinter import * from tkinter.messagebox import showinfo def reply(name): showinfo(title="Reply", message = "Hello %s!" % name) top = Tk() top.title("Echo") top.iconbitmap("Iconshock-Folder-Gallery.ico") Label(top, text="Enter your name:").pack(side=TOP) ent = Entry(top) ent.bind("<Return>", (lambda event: reply(ent.get()))) ent.pack(side=TOP) btn = Button(top,text="Submit", command=(lambda: reply(ent.get()))) btn.pack(side=LEFT) top.mainloop()

Como puede ver, la creación de una función lambda con una variable "evento" no utilizada resuelve el problema.