我有一个 tkinter 框架和一个按钮:
from tkinter import *
def rand_func(a,b,c,effects):
print (a+b+c)
root=Tk()
frame=Frame(root)
frame.bind("<Return>",lambda a=10, b=20, c=30: rand_func(a,b,c))
frame.pack()
button=Button(frame, text="click me", command=lambda a=1,b=2,c=3,eff=None:rand_func(a,b,c))
button.pack()
root.mainloop()
我希望在用户按下回车键和按下按钮时完成相同的功能。可悲的是,上面的代码在框架绑定(bind)处给出了一个错误。有谁知道这个问题的解决方案吗?
最佳答案
当您使用 bind
创建绑定(bind)时,Tkinter 会自动添加一个包含有关事件信息的参数。您需要在您的 rand_func
定义或您如何调用它时考虑到这一点。
当您使用 command
属性时,不包含此参数。您必须在每种情况下如何调用函数或函数如何解释其参数时注意考虑这个额外的参数。
这是一种在绑定(bind)中使用 lambda
的解决方案,仅在使用 bind
命令时才接受额外事件,但不将其传递给最终命令。
import tkinter as tk
class SampleApp(tk.Tk):
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
self.frame = tk.Frame(self)
self.frame.pack()
self.button = tk.Button(self.frame, text="click me",
command=lambda a=1, b=2, c=3:
self.rand_func(a, b, c))
self.button.pack()
self.frame.bind("<Return>",
lambda event, a=10, b=20, c=30:
self.rand_func(a, b, c))
# make sure the frame has focus so the binding will work
self.frame.focus_set()
def rand_func(self, a, b, c):
print "self:", self, "a:", a, "b:", b, "c:", c
print (a+b+c)
app = SampleApp()
app.mainloop()
话虽如此,绑定(bind)到框架很少是正确的做法。通常一个框架不会有键盘焦点,除非它有焦点,否则绑定(bind)永远不会触发。如果您正在设置全局绑定(bind),您应该绑定(bind)到“all”绑定(bind)标签(使用 bind_all 方法)或绑定(bind)到顶层小部件。
关于python - Tkinter 将带参数的函数绑定(bind)到小部件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7299955/