OptionMenu命令函数需要参数

时间:2016-03-13 18:40:50

标签: python python-3.x tkinter

这是关于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):

似乎有效。但为什么呢?

1 个答案:

答案 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())