首页 文章

使用不同的类时,标签和按钮重叠,tkinter

提问于
浏览
0

我正在使用Python进行扫雷游戏,并且在使用Tkinter创建图形时遇到了问题 .

扫雷阵列由通过不同类创建的按钮组成 . 我使用grid()将它们放在窗口中 . 但是,当我想在窗口中放置其他项目时,例如检查按钮和标签,它们似乎不适用于按钮数组 . 我正试图让窗口左上角的按钮和右边的标签 . 但是当我尝试将它放在网格中时,它也会在窗口的左上角结束,无论我指定哪个行或列 .

当我在同一个类中创建按钮时,我没有遇到这个问题,但是由于其他原因,我最好将它们放在不同的类中 .

这是我正在尝试做的简化版本:

from tkinter import *

class Square(Frame):
    def __init__(self):
        self.button=Button(text="  ")

class App(Frame):
    def __init__(self,master):
        super(App,self).__init__(master)
        self.grid()
        self.matrix=[[None for i in range(10)] for i in range(10)]
        for x in range(10):
            for y in range(10):
                self.matrix[x][y]=Square()
                self.matrix[x][y].button.grid(row=x,column=y)
        self.label=Label(self, text="Hello")
        self.label.grid(row=0, column=10)

root=Tk()
App(root)
root.mainloop()

1 回答

  • 0

    问题的根源在于矩阵中的小部件将根窗口作为父窗口,标签将内部框架作为父窗口 . 您应该将 self 传递给 Square 类的构造函数(例如:self.matrix [x] [y] = Square(self) ) so that the buttons are children of the App`类 .

    就个人而言,我认为更好的设计是将按钮矩阵放在自己的框架内,与其他控件分开 . 我会创建一个 Grid 类,它是一个框架和按钮,没有别的 . 然后,你的主程序变成这样的:

    class App(Frame):
        def __init__(self, master):
            self.matrix = Grid(self, 10, 10)
            self.label = Label(self, text="Hello")
            self.matrix.grid(row=0, column=0, sticky="nsew")
    
            self.label.grid(row=0, column=1, sticky="nsew")
            self.grid_rowconfigure(0, weight=1)
            self.grid_columnconfigure(0, weight=1)
    

相关问题