我是一名Python开始自学者,在MacOS上运行。
我正在tkinter中创建一个带有文本解析器GUI的程序,在Entry
窗口小部件中键入命令,然后点击Button
窗口小部件,触发我的parse()
功能等,将结果打印为Text
小部件,文本冒险风格。
>绕过按钮
我不能让你这样做,戴夫。
我试图找到一种方法来摆脱每次用户发出命令时将鼠标拖到Button
的需要,但这比我想象的更难。
我猜测正确的代码看起来像self.bind('<Return>', self.parse())
?但我甚至不知道把它放在哪里。 root
,__init__
,parse()
和create_widgets()
不想要它。
要明确的是,任何人都应该在prog中输入的唯一原因是触发parse()
,因此不需要特别支持Entry
小部件。它工作的任何地方都很好。
回应7stud,基本格式:
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()
答案 0 :(得分:43)
尝试运行以下程序。当你点击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
调用相同的函数 - 因为命令函数需要是一个不带参数的函数,而绑定函数需要是一个带有一个参数的函数(事件对象):
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()
答案 1 :(得分:7)
另一种选择是使用lambda:
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”创建lambda函数可以解决问题。
答案 2 :(得分:0)
我发现关于使用绑定的一件好事是,您了解触发事件:类似:“您单击事件= [ButtonPress事件状态= Mod1 num = 1 x = 43 y = 20]”,原因是下面的代码:
self.submit.bind('<Button-1>', self.parse)
def parse(self, trigger_event):
print("You clicked with event = {}".format(trigger_event))
比较以下两种对按钮单击进行编码的方式:
btn = Button(root, text="Click me to submit", command=(lambda: reply(ent.get())))
btn = Button(root, text="Click me to submit")
btn.bind('<Button-1>', (lambda event: reply(ent.get(), e=event)))
def reply(name, e = None):
messagebox.showinfo(title="Reply", message = "Hello {0}!\nevent = {1}".format(name, e))
第一个正在使用不带参数的命令功能,因此无法传递事件。 第二个是绑定函数,它可以接受事件传递并输出类似“ Hello Charles!event = [ButtonPress event state = Mod1 num = 1 x = 68 y = 12]”的字样
我们可以左键单击,中键单击或右键单击与事件编号分别为1、2和3对应的鼠标。代码:
btn = Button(root, text="Click me to submit")
buttonClicks = ["<Button-1>", "<Button-2>", "<Button-3>"]
for bc in buttonClicks:
btn.bind(bc, lambda e : print("Button clicked with event = {}".format(e.num)))
输出:
Button clicked with event = 1
Button clicked with event = 2
Button clicked with event = 3