我正在使用Tkinter进行简单的琐事游戏。有几个按钮,每个答案一个,我想在点击一个按钮时运行带有某些参数的checkAnswer功能。
如果我使用以下内容:
self.option1 = Button(frame, text="1842", command=self.checkAnswer(question=3, answer=2))
然后它将运行checkAnswer并使用它返回的内容(无)。
是否有一种简单的方法可以在按钮构造函数中存储参数?
答案 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))