Если у вас есть по крайней мере Python 2.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
Ваш пример может быть выполнен как
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"))
Если у вас нет 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)))