我的游戏设计是这样的 我需要开发战略性tic tac toe(在每个tic tac toe块我们将找到一个tic tac toe)....所以在这里我创建了9帧,每帧有9个按钮...... 但当我点击任何框架中的按钮时,更改只出现在一帧中,即;在(0,2)我知道,因为它的最后一帧将被调用..所以我需要帮助来纠正问题...我试过但我没有得到它提前谢谢 这是我的代码
from Tkinter import *
root = Tk()
root.title("Simple Design")
root.geometry("300x300")
class Design:
count = 0
def __init__(self):
self.duplicates = {}
self.block = {}
self.button = {}
for i in range(3):
for j in range(3):
self.duplicates[i, j] = "."
self.frame()
def frame(self):
for i, j in self.duplicates:
self.block[i, j] = Frame(root, background="blue")
self.block[i, j].grid(row=i, column=j, ipadx=5, ipady=2)
self.button_create(self.block[i, j])
def button_create(self, frame):
for i, j in self.duplicates:
handler = lambda a=i, b=j: self.update(a, b)
self.button[i, j] = Button(frame, command=handler, text=".", height=3, width=5)
self.button[i, j].grid(row=i, column=j)
def update(self, i, j):
if (Design.count % 2 == 0):
self.button[i, j]["text"] = "X"
Design.count += 1
else:
self.button[i, j]["text"] = "O"
Design.count += 1
self.button[i, j]["state"] = "disabled"
print (i, j)
d = Design() # out of class
root.mainloop()
答案 0 :(得分:0)
您的按钮处理程序出现问题:每个按钮如何知道其坐标?
只需替换:
handler = lambda a=i, b=j: self.update(a, b)
人:
handler = lambda: self.update(i, j)
frame
方法中还存在一个错误:
您迭代duplicates
,然后调用button_create
,再次迭代duplicates
。所以按钮在内循环中重新定义。
您可以像这样更改button_create
:
def button_create(self, frame, i, j):
handler = lambda: self.update(i, j)
self.button[i, j] = Button(frame, command=handler, text=".", height=3, width=5)
self.button[i, j].grid(row=i, column=j)
然后调整frame
中的通话,如下所示:
def frame(self):
for i, j in self.duplicates:
self.block[i, j] = Frame(root, background="blue")
self.block[i, j].grid(row=i, column=j, ipadx=5, ipady=2)
self.button_create(self.block[i, j], i, j)
另请注意,您应该继承object
类以使用新式类:
class Design(object):
...
您可以使用映射来计算if ... else
中的符号“X”或“O”,而不是update
:
def update(self, i, j):
symbol = {0: "X", 1: "O"}[Design.count % 2]
self.button[i, j]["text"] = symbol
Design.count += 1
self.button[i, j]["state"] = "disabled"
print (i, j)
或者简单地说:
symbol = "XO"[Design.count % 2]