Tkinterを使用してTic Tac Toeのゲーム用の簡単なGUIを実装しようとしています。最初のステップとして、ラベルを付けられていない状態からクリックされたときに「X」というラベルに変更される一連のボタンを作成しようとしています。私は、次のことを試してみた:Tkinterを使用してクリックするとテキストを変更するボタンの配列を作成する方法
import Tkinter as tk
class ChangeButton:
def __init__(self, master, grid=np.diag(np.ones(3))):
frame = tk.Frame(master)
frame.pack()
self.grid = grid
self.buttons = [[tk.Button()]*3]*3
for i in range(3):
for j in range(3):
self.buttons[i][j] = tk.Button(frame, text="", command=self.toggle_text(self.buttons[i][j]))
self.buttons[i][j].grid(row=i, column=j)
def toggle_text(self, button):
if button["text"] == "":
button["text"] = "X"
root = tk.Tk()
root.title("Tic Tac Toe")
app = ChangeButton(root)
root.mainloop()
しかし、結果のウィンドウは次のようになります。
やボタンクリック時に変更されません。なぜこれがうまくいかないのでしょうか?
簡単に言えば: 'command'機能を必要とするが、self.toggle_text(self.buttons [i]が[j]を)'直後に評価されます(それが起こりますすぐに)、何も返さない(ボタンをクリックしても何も起こらない)。 'lambda'ラッパーが推奨されます。 – TigerhawkT3
あなたはそれを修正し、任意のボタンをクリックするだけが最後のボタンに影響することを尋ねる質問はおそらく[この1つ]です(http://stackoverflow.com/questions/10865116/python-tkinter-creating-buttons-in -for-loop-passing-command-arguments)を使用します。 – TigerhawkT3
@ TigerhawkT3さらに2つの問題があります。偽装はそのうちの1つのみを扱います。 –