如何在python类中修复我的代码变量?

时间:2012-12-03 00:10:19

标签: python class variables button tkinter

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

如何修复我的代码,以便输入变量? 这只是我正在做的一项测试,所以我可以使用更大的代码。

3 个答案:

答案 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"])