这是关于tkinter中的optionmenu小部件的一般性问题。
在定义OptionMenu小部件并将函数指定为其命令时,为什么需要参数?
我的代码:
from tkinter import *
def update():
x = optionvar.get()
x = str(x)
mylabel.config(text=x)
root = Tk()
l = []
for n in range(10):
l.append(n)
t = tuple(l)
optionvar = IntVar()
optionvar.set('hello stackoverflow')
mymenu = OptionMenu(root, optionvar, *t, command=update)
mylabel = Label(root)
mymenu.pack()
mylabel.pack()
我的错误:
TypeError: update() takes 0 positional arguments but 1 was given
只需使用
定义更新def update(foo):
似乎有效。但为什么呢?
答案 0 :(得分:2)
回调通常想知道选择了哪个项目,因此IntVar的值作为参数传递。如果要忽略该参数,可以简单地使用lambda(_
是一个有效的名称,通常用于表示它是一个一次性变量):
mymenu = OptionMenu(root, optionvar, *t, command=lambda _: update())
原始错误答案:
有时,您将使用与20个不同OptionMenu
相同的函数,并且您将想知道哪个函数正在调用该函数。告诉你,它将OptionMenu
作为参数传递给函数。如果您不想以不同方式定义回调,可以使用lambda
函数:
mymenu = OptionMenu(root, optionvar, *t, command=lambda x: update())