【问题标题】:button in frames in pythonpython框架中的按钮
【发布时间】:2017-01-20 13:05:17
【问题描述】:

我的游戏设计是这样的 我需要开发战略井字游戏(在每个井字游戏块中,我们会找到一个井字游戏)......所以在这里我创建了 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()

【问题讨论】:

    标签: python button tkinter frames


    【解决方案1】:

    您的按钮处理程序存在问题:每个按钮如何知道其坐标?

    只需替换:

    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):
        ...
    

    您可以使用映射来计算update 中的符号“X”或“O”,而不是if ... else

    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]
    

    【讨论】:

    • 不,不是那样......当我现在替换处理程序时,它只在该按钮(0,2)的框架(0,2)中更改文本......其他按钮保持不变当我点击它们时更改任何文本。
    • 我保留了我的设计图像..你说的并没有做类似的事情,它只是在框架上保留一个框架..但我不需要那个..我的问题是当我单击任何按钮文本仅在右上角的框架上更改。
    • 好的,你有一个 main frame 和 9 个 boards,其中包含 buttons 的 3×3 矩阵(总共 81 个按钮)。这样对吗?您应该有一个用于 main frame 的类和一个用于 board frames 的类(实例化 9 次)。实施起来会更容易。
    • 是的...我所做的是创建 9 个框架,每个框架包含 3*3 板..但是当我单击任何框架上的按钮时,它不会更改该按钮的文本...而是更改(0,2)框架中按钮的文本
    猜你喜欢
    • 1970-01-01
    • 2018-05-05
    • 1970-01-01
    • 2018-05-11
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多