python中的帧中的按钮

时间:2016-09-13 02:30:10

标签: python button tkinter frames

enter image description here 我的游戏设计是这样的 我需要开发战略性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()

1 个答案:

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