from tkinter import *
class GameBoard(Frame):
def __init__(self):
top = Toplevel()
Frame.__init__(self)
self.master.title("test")
self.grid()
#button frame
self.__buttonPane = Frame(self)
self.__buttonPane.grid()
#buttons
self.__buttonA1 = Button(self.__buttonPane,text = "A1",command = self._test("A"))
self.__buttonA1.grid()
def _test(self,test):
if self.__buttonA1["state"] == NORMAL:
print(test)
def main():
GameBoard().mainloop()
main()
此代码由于变量而无效,如果我删除变量test并将其设为
from tkinter import *
class GameBoard(Frame):
def __init__(self):
top = Toplevel()
Frame.__init__(self)
self.master.title("test")
self.grid()
#button frame
self.__buttonPane = Frame(self)
self.__buttonPane.grid()
#buttons
self.__buttonA1 = Button(self.__buttonPane,text = "A1",command = self._test)
self.__buttonA1.grid()
def _test(self):
if self.__buttonA1["state"] == NORMAL:
print("hi")
def main():
GameBoard().mainloop()
main()
如何修复我的代码,以便输入变量? 这只是我正在做的一项测试,所以我可以使用更大的代码。
答案 0 :(得分:3)
问题是当你执行command = self._test("A")
时,你正在调用该函数,并使用返回的值(在这种情况下为None
)。
解决方案是使用functools.partial()
,它接受一个函数和一些值,然后给你一个新函数,它只用你传递给它的值调用给定函数(以及你运行时传递的任何其他函数)它):
command = functools.partial(self._test, "A")
您也可以通过让函数返回函数来手动执行此操作:
def _test(self, test):
def f(self):
if self.__buttonA1["state"] == NORMAL:
print(test)
return f
请注意,这会影响您在其他地方正常呼叫_test()
的能力。
答案 1 :(得分:2)
指定command = self._test
时,self._test
是一个将被调用的函数。 self._test("A")
不是函数,它是对函数的调用(返回None
,因为定义中没有return
语句。
您可以编写'将self._test("A")
作为lambda: self._test("A")
或functools.partial(self._test, "A")
,或明确地GameBoard.__init__
调用的函数:
def _f():
self._test("A")
self.__buttonA1 = Button(self.__buttonPane,text = "A1",command = _f)
答案 2 :(得分:0)
为按钮创建处理程序时,最好将按钮本身传递给处理程序。这样,单个处理程序可以处理许多按钮,处理程序可以自由地检查按钮的所有属性。
以下是基于代码实现此目的的简单方法:
self.__buttonA1 = Button(self.__buttonPane,text = "A1")
self.__buttonA1.grid()
self._connect_button(self.__buttonA1, self._test)
self.__buttonA2 = Button(self.__buttonPane,text = "A2")
self.__buttonA2.grid()
self._connect_button(self.__buttonA2, self._test)
def _connect_button(self, button, handler):
button['command'] = lambda: handler(button)
def _test(self, button=None):
if button is not None:
print("test:text:", button["text"])
print("test:state", button["state"])