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

このコードは変数が原因で機能しません。変数テストを削除して作成すると、

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

ボタンのハンドラーを作成するときは、ボタン自体をハンドラーに渡すことをお勧めします。そうすれば、1つのハンドラーで多くのボタンを処理でき、ハンドラーはボタンのすべてのプロパティを自由に調べることができます。

コードに基づいてこれを実現する簡単な方法は次のとおりです。

    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 に答える