0
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()

我将如何修复我的代码以便允许输入变量?这只是我正在做的一个测试,所以我可以让它在更大的代码中工作。

4

3 回答 3

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()

于 2012-12-03T00:29:40.303 回答
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)
于 2012-12-03T00:32:14.780 回答
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"])
于 2012-12-03T02:03:29.337 回答