【问题标题】:OptionMenu command function requires argumentOptionMenu 命令函数需要参数
【发布时间】:2021-02-26 04:21:04
【问题描述】:

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

似乎有效。但为什么呢?

【问题讨论】:

    标签: python python-3.x tkinter


    【解决方案1】:

    回调通常想知道选择了哪个项目,因此 IntVar 的值作为参数传递。如果您想忽略该参数,您可以简单地使用 lambda(_ 是一个有效名称,通常用于指示它是一次性变量):

    mymenu = OptionMenu(root, optionvar, *t, command=lambda _: update())
    

    【讨论】:

    • 谢谢!很难向我的老师解释为什么我传递了一个未使用的变量...
    • 如果我想将此功能用于按钮,我如何将按钮本身作为参数传递(例如计算器)?
    • Here 是一个告诉你如何做到这一点的答案。
    • 你所说的关于它的工作原理是不正确的:它没有将 OptionMenu 实例作为参数传递给函数,它传递了与菜单关联的 值被选中的项目(在本例中为 int)。
    • @martineau:我不敢相信我竟然在没有测试的情况下发布了答案。我的立场是正确的。
    猜你喜欢
    • 1970-01-01
    • 2021-06-28
    • 2015-10-07
    • 2016-06-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-29
    • 2019-02-24
    相关资源
    最近更新 更多