【问题标题】:Calling functions with arguments on "command" and "bind"使用“命令”和“绑定”参数调用函数
【发布时间】:2012-02-22 13:56:37
【问题描述】:

我想指出,我从短时间内开始学习 python。 问题将是初学者的问题。

我需要在程序顶部的菜单中添加命令,这将调用函数“color_picker(“red”)。

kolory.add_command(label="Czerwony", command=color_picker('red')) 当我使用它时,它有点错误,因为它在程序启动后被调用,它不等我点击菜单按钮。 (我很确定,因为我在该函数中添加了“showinfo”,它会在我做任何事情之前显示消息) kolory.add_command(label="Czerwony", command=lambda: color_picker('red')) 有点用,但我不知道“lambda”在这里是什么意思。它是在菜单选项下调用带有参数的函数的唯一方法吗?

同样的问题也适用于绑定键盘快捷键。 okno.bind("1", color_picker) - 将调用函数但没有参数,应该是颜色。我该怎么做?

那么,如何使用 add_command 为函数分配带参数的函数、键盘快捷键和菜单?

PS。正在通过谷歌搜索,但似乎 python 没有像 c# 那样好的文档,例如。或者我太笨了,找不到。

编辑:

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Python27\lib\lib-tk\Tkinter.py", line 1410, in __call__
    return self.func(*args)
TypeError: color_picker() takes at most 1 argument (2 given)

这是错误消息,当我尝试在 okno.bind 中使用“pick_red”时

【问题讨论】:

  • Python 文档可以通过交互式 python shell 中的help() 函数访问。在您的情况下,帮助kolory.add_command 可能是您正在寻找的文档。

标签: python tkinter


【解决方案1】:

我不确定我是否理解这个问题,但这里是;

问题在于您正在调用color_picker 函数(通过在函数名称后添加())。

您要做的是传递实际的函数,而不是函数调用的结果作为command关键字参数,例如add_command(label="Czerwony", command=color_picker)

但是,既然你想给它一个固定的参数'red',你必须使用来自functoolspartial,类似于;

from functools import partial
pick_red = partial(color_picker, "red")
kolory.add_command(label="Czerwony", command=pick_red)

编辑

现在您的错误消息显示您正在使用Tkinter,我们可以看到,根据documentation,赋予bind() 的函数总是传递一个event 参数,因此您需要一个函数可以接受;

def pick_red_with_event(event):
    # We really do nothing with event for now but we always get it...
    color_picker("red")

okno.bind("1", pick_red_with_event)

同样的事情适用于okno.bind,如果你已经像上面那样定义了pick_red,就这样做:

okno.bind("1", pick_red)

【讨论】:

  • 是的,你理解得很好。这正是我的意思。它适用于 add_command,但它给我一个绑定错误。我将在我的帖子中发布错误消息。
  • re:“你必须使用 functools 中的部分内容”——该语句有点不正确。你没有理由必须使用它,但你肯定可以使用它。您也可以使用 lambda。这个答案给人的印象是 functools.partial 是唯一的解决方案。
猜你喜欢
  • 1970-01-01
  • 2015-05-08
  • 1970-01-01
  • 2019-12-25
  • 2016-02-01
  • 2015-08-20
  • 2015-07-29
  • 2019-09-09
  • 1970-01-01
相关资源
最近更新 更多