1

我想设置一个对象的颜色,不想为每种颜色创建 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通过单击按钮调用带有参数的 ?

4

2 回答 2

2

command调用对象不接受任何参数。如果要将green列表传递给printfunction,只需省略参数,lambda 不需要它:

Btn=Button(text="Trigger lambda", command=lambda: printfunction(green))

现在green内部的 lambda 指的是全局。

如果您只想printfunction使用预定义的参数进行调用,则可以使用该functools.partial()函数;您将要调用的函数以及需要传入的任何参数传递给它,当它的返回值被调用时,它就会这样做;使用您指定的参数调用函数:

from functools import partial

Btn=Button(text="Trigger lambda", command=partial(printfunction, green))
于 2013-05-19T11:12:41.470 回答
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 实现允许创建成员函数,因此可以选择使用它作为替换。

于 2013-05-19T11:52:20.167 回答