我想设置一个对象的颜色,而不想为每种颜色创建10个函数。 所以,我只想声明颜色并创建10个按钮和一个功能。错误信息是:
<lambda>() missing 1 required positional argument: 'green'
代码:
from tkinter import *
green=["#5bd575","#55c76d"]
#different colors should follow here
root=Tk()
Btn=Button(text="Trigger lambda", command=lambda green: printfunction(green))
Btn.pack()
def printfunction(colorset):
print(colorset)
它不需要是lambda函数,问题是,如何通过单击按钮调用带有参数的printfunction
?
答案 0 :(得分:2)
command
callable不会使用任何参数。如果您想将green
列表传递到printfunction
,只需省略参数,lambda就不需要它了:
Btn=Button(text="Trigger lambda", command=lambda: printfunction(green))
现在lambda内的green
指的是全局。
如果您只想使用预定义的参数调用printfunction
,则可以使用functools.partial()
function;你传递了要调用的函数加上需要传入的任何参数,并且当调用它的返回值时,它就会这样做;使用您指定的参数调用该函数:
from functools import partial
Btn=Button(text="Trigger lambda", command=partial(printfunction, green))
答案 1 :(得分:0)
Python非常动态,您可以在定义后修改类或创建本地函数。例如:
class X:
# generic print function
def print_color(self, color):
pass
# dictionary with colors to support
COLORS = {'green': ["#5bd575","#55c76d"]}
# attach various print functions to class X
for name, value in COLORS.items():
def print_color_x(self, value=value):
self.print_color(value)
setattr(X, 'print_color_{}'.format(name), print_color_x)
请注意value=value
默认参数。这是在每次迭代中绑定值所必需的。没有它,value
的查找将在调用函数时发生,给出错误的全局value
错误或者找到它碰巧在那里找到的随机错误,但不会找到你的那个想。如果允许创建正确的成员函数而不仅仅是静态函数,则使用functools.partial()
可能更清晰。请注意,文档中提到的示例纯Python实现允许创建成员函数,因此使用它作为替换是一个选项。