Python - 使用参数存储函数

时间:2012-05-21 21:04:37

标签: python tkinter

我正在使用Tkinter进行简单的琐事游戏。有几个按钮,每个答案一个,我想在点击一个按钮时运行带有某些参数的checkAnswer功能。

如果我使用以下内容:

self.option1 = Button(frame, text="1842", command=self.checkAnswer(question=3, answer=2))

然后它将运行checkAnswer并使用它返回的内容(无)。

是否有一种简单的方法可以在按钮构造函数中存储参数?

5 个答案:

答案 0 :(得分:10)

这正是functools.partial()的目的:

>>> import functools
>>> print_with_hello = functools.partial(print, "Hello")
>>> print_with_hello("World")
Hello World
>>> print_with_hello()
Hello

partial()返回一个新函数,其行为与旧函数一样,但是您传入的任何参数都已填充,所以在您的情况下:

import functools

...

self.option1 = Button(frame, text="1842", command=functools.partial(self.checkAnswer, question=3, answer=2))

答案 1 :(得分:1)

您可以创建一个更高阶的函数来包装checkAnswer函数。这将允许您返回不需要任何参数的函数,因此可以用作回调。

例如:

def makeCheckAnswer(self, **kwargs)
    return lambda: self.checkAnswer(**kwargs)

这将使您的按钮初始化:

self.option1 = Button(frame, text="1842", command=self.makeCheckAnswer(question=3, answer=2))

答案 2 :(得分:1)

到目前为止最容易就是使用lambda

self.option1 = Button(frame, text="1842", 
    command=lambda: self.checkAnswer(question=3, answer=2))

虽然在类似但有点复杂的情况下,你真的应该使用函数工厂,如

def answerCheckerFactory(self, question, answer):
    def checker():
        return self.checkAnswer(question, answer)

    return checker

    ...
    self.option1 = Button(frame, text="1842", 
        command=self.answerCheckerFactory(question=3, answer=2))

因为它会确保您传入正确的参数(例如,不是quetsion(原文如此));注意与functools.partial的区别,它允许您输入错误的函数参数并仅在单击按钮时获取异常;)

此外,在按钮代码中对问题/答案进行硬编码似乎不正确......

答案 3 :(得分:0)

如果您的函数具有特定参数(不依赖于text.get()之类的东西),您可以使用包装器,除了lambada函数之外,这是最简单的方法。例如:

def option1wrapper():
    ClassName.checkAnswer(question=3,answer=2)
self.option1 = Button(frame, text="1842", command=option1wrapper)

答案 4 :(得分:0)

只有你需要使用这样的 lambda 函数

self.option1 = lambda: Button(frame, text="1842", command=self.checkAnswer(question=3, answer=2))