python框架中的按钮

2024-03-28 20:47:08 发布

您现在位置:Python中文网/ 问答频道 /正文

enter image description here 我的游戏设计是这样的 我需要发展战略井字游戏(在井字游戏的每个区块,我们会发现井字游戏)…所以在这里,我创造了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()

Tags: textinself游戏fordefcountbutton
1条回答
网友
1楼 · 发布于 2024-03-28 20:47:08

您的按钮处理程序有一个问题:每个按钮如何知道其坐标?你知道吗

只需替换:

handler = lambda a=i, b=j: self.update(a, b)

签署人:

handler = lambda: self.update(i, j)

frame方法中还有一个bug: 您迭代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,您可以使用映射来计算update中的符号“X”或“O”:

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]

相关问题 更多 >