tkinter:为按下按钮时调用的函数指定参数

2024-10-03 00:23:10 发布

您现在位置:Python中文网/ 问答频道 /正文

button1 = tkinter.Button(frame, text="Say hi", command=print)
button2 = tkinter.Button(frame, text="foo", command=print)
button3 = tkinter.Button(frame, text="bar", command=print)

你可能发现了我程序中的漏洞:print不能指定参数。这使得整件事毫无用处,而且有缺陷。很明显,有

^{pr2}$

将在对象实际实例化时调用该函数,并使command成为该函数调用的返回值(如果有)。(不是我想要的)

那么,如何在上述场景中指定参数,并避免为每个按钮定义单独的command函数?在


Tags: 函数text参数footkinterbarbuttonhi
2条回答

一个简单的解决方案是使用lambda,它允许您创建匿名函数。在

button1 = tkinter.Button(frame, text="Say hi", command=lambda: print("Say hi")
button2 = tkinter.Button(frame, text="foo", command=lambda: print("foo"))
button3 = tkinter.Button(frame, text="bar", command=lambda: print("bar"))

另一个选择是使用functools.partial,在这个答案中有一点解释:https://stackoverflow.com/a/2297423/7432

如果您至少有Python2.6(我猜是这样的,因为您在函数位置使用print),那么可以使用functools.partial。它接受要提供的函数和任何参数,并返回一个可调用函数,该函数将调用基础函数并添加传递给最终调用的任何参数。例如:

>>> from functools import partial
>>> def add(x,y): return x+y
>>> add2 = partial(add,2)
>>> add3 = partial(add,3)
>>> add2(3)
5
>>> add3(5)
8

你的例子可以这样做

^{pr2}$

如果没有2.6,则可以将部分实现为:

def partial(fun, *args, **kwargs):
  def merge(d1,d2):
    r = dict(d1)
    r.update(d2)
    return r
  return lambda *a,**kw: fun(*(args+a),**(merge(kwargs,kw)))

相关问题 更多 >