Как привязать клавишу enter к функции в tkinter?
Я начинающий самостоятельный ученик Python, работающий на MacOS.
я делаю программу с GUI синтаксического анализатора текста в tkinter, где вы вводите команду в Entry
виджет, и нажмите Button
виджет, который запускает my parse()
funct, ect, печатая результаты к Text
виджет, текст-приключенческий стиль.
> обойти кнопку
2 ответов
попробуйте запустить следующую программу. Вы просто должны быть уверены, что ваше окно имеет фокус, когда вы нажмете Return-чтобы убедиться, что это так, сначала нажмите кнопку пару раз, пока не увидите какой-то выход, а затем, не нажимая нигде больше, нажмите Return.
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()
тогда у вас просто есть немного настроек, когда вы делаете оба button click
и hitting Return
вызовите ту же функцию--потому что функция команды должна быть функцией, которая не принимает аргументов, тогда как функция bind должна быть функция, которая принимает один аргумент(объект, событие):
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()
или вы можете просто отказаться от использования аргумента команды кнопки и вместо этого использовать bind (), чтобы прикрепить функцию onclick к кнопке, что означает, что функция должна принять один аргумент-так же, как с Return:
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()
вот он в настройке класса:
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()
Другой альтернативой является использование лямбда:
ent.bind("<Return>", (lambda event: name_of_function()))
полный код:
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()
Как вы можете видеть, создание лямбда-функции с неиспользуемой переменной "event" решает проблему.