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)
Run Code Online (Sandbox Code Playgroud)
你可能已经发现了程序中的漏洞:print无法指定参数.这使得整个事情变得毫无用处和错误.显然,有类似的东西
command=print("foo")
Run Code Online (Sandbox Code Playgroud)
将在实际实例化对象时调用该函数,并command生成该函数调用的返回值(如果有).(不是我想要的)
那么,如何在上述场景中指定参数,并避免command为每个按钮定义单独的函数?
如果你至少有python 2.6(我猜你是因为你在函数位置使用print)你可以使用functools.partial.它需要一个函数和任何参数来提供和返回一个调用底层函数的callable,并添加传递给最终调用的任何参数.例如:
>>> 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
Run Code Online (Sandbox Code Playgroud)
你的例子可以完成
from functools import partial
button1 = tkinter.Button(frame, text="Say hi", command=partial(print,"hi"))
button2 = tkinter.Button(frame, text="foo", command=partial(print,"foo"))
button3 = tkinter.Button(frame, text="bar", command=partial(print,"bar"))
Run Code Online (Sandbox Code Playgroud)
如果你没有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)))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2264 次 |
| 最近记录: |