padx 值似乎会影响 tkinter 框架的排列

padx values seem to affect the arrangement of tkinter Frames

所以看看下面的图片。

在这个 window 上我有 3 个框架,它们实际上是从 tk.Frame 继承的(我认为这在这里没有什么区别)。

第一个框架位于顶部,它有 3 个按钮,并且将在后面的部分添加一个 program.Second 框架由 3x3 布局中的这 9 个按钮组成。 第三帧有一个标签(我实际上想要两个标签,一个在左边,一个在右边。)

我想要实现的是保持第一帧不变,第二帧的 3x3 布局需要居中(至少水平),第三帧的标签,一个在左边大多数和其他(还没有添加)绝对正确。

我观察到,每当我更改第一帧中任何按钮的 padx(甚至 ipadx)值时,它似乎都会更改该 3x3 布局的位置。就像我为 Stats Button 增加 padx 一样,它会将 3x3 布局和最底部的标签都向右滑动。我觉得这很奇怪,因为完全不同的框架中的某些东西的填充不应该影响任何其他框架的布局。

这是问题的 MCVE:

import tkinter as tk

class MenuBar(tk.Frame):
    def __init__(self, root):
        tk.Frame.__init__(self, root)


class StBar(tk.Frame):
    def __init__(self, root):
        tk.Frame.__init__(self, root)


class MidSpace(tk.Frame):
    def __init__(self, root):
        tk.Frame.__init__(self, root)


class MainApp:
    def __init__(self, root):
        self.root = root
        self.StBar = StBar(self.root)
        self.MenuBar = MenuBar(self.root)
        self.MidSpace = MidSpace(self.root)

        self.root.grid_rowconfigure(0, weight=3)
        self.root.grid_rowconfigure(1, weight=55)
        self.root.grid_rowconfigure(2, weight=2)

        self.MenuBar.grid(row=0, column=0)
        self.MidSpace.grid(row=1, column=0)
        self.StBar.grid(row=2, column=0)

        self.htpb = tk.Button(self.MenuBar, text='How To Play', width=14,
                          bg='#00f', fg='#fff')
        self.htpb.grid(row=0, column=0, padx=10, ipady=5, sticky=tk.N + tk.S)

        self.statb = tk.Button(self.MenuBar, text='Stats', width=14,
                           bg='#00f', fg='#fff')
        self.statb.grid(row=0, column=1, padx=10, ipady=5, sticky=tk.N + tk.S)

        self.resb = tk.Button(self.MenuBar, text='Results', width=14,
                          bg='#00f', fg='#fff')
        self.resb.grid(row=0, column=2, padx=10, ipady=5, sticky=tk.N + tk.S)

        self.stLabel = tk.Label(self.StBar,
                            text='Some single line text here', bg='#00f',
                            fg='#fff', font=('roboto', 13))
        self.stLabel.pack(anchor=tk.W)

        self.b1 = tk.Button(self.MidSpace, text='  ',
                        bg='#da5', fg='#250038',
                        font=('roboto', 20), width=2, height=1)
        self.b2 = tk.Button(self.MidSpace, text='  ',
                        bg='#745', fg='#380601',
                        font=('roboto', 20), width=2, height=1)
        self.b3 = tk.Button(self.MidSpace, text='  ',
                        bg='#da5', fg='#250038',
                        font=('roboto', 20), width=2, height=1)
        self.b4 = tk.Button(self.MidSpace, text='  ',
                        bg='#745', fg='#380601',
                        font=('roboto', 20), width=2, height=1)
        self.b5 = tk.Button(self.MidSpace, text='  ',
                        bg='#da5', fg='#250038',
                        font=('roboto', 20), width=2, height=1)
        self.b6 = tk.Button(self.MidSpace, text='  ',
                        bg='#745', fg='#380601',
                        font=('roboto', 20), width=2, height=1)
        self.b7 = tk.Button(self.MidSpace, text='  ',
                        bg='#da5', fg='#250038',
                        font=('roboto', 20), width=2, height=1)
        self.b8 = tk.Button(self.MidSpace, text='  ',
                        bg='#745', fg='#380601',
                        font=('roboto', 20), width=2, height=1)
        self.b9 = tk.Button(self.MidSpace, text='  ',
                        bg='#da5', fg='#250038',
                        font=('roboto', 20), width=2, height=1)

        self.b1.grid(row=0, column=0, ipadx=40, ipady=40)
        self.b2.grid(row=0, column=1, ipadx=40, ipady=40)
        self.b3.grid(row=0, column=2, ipadx=40, ipady=40)
        self.b4.grid(row=1, column=0, ipadx=40, ipady=40)
        self.b5.grid(row=1, column=1, ipadx=40, ipady=40)
        self.b6.grid(row=1, column=2, ipadx=40, ipady=40)
        self.b7.grid(row=2, column=0, ipadx=40, ipady=40)
        self.b8.grid(row=2, column=1, ipadx=40, ipady=40)
        self.b9.grid(row=2, column=2, ipadx=40, ipady=40)

if __name__ == '__main__':
    win = tk.Tk()
    win.geometry('1360x710')
    win.title('TicTacToe - pssolanki')
    win.wm_geometry("+0+0")
    win.configure(bg='#fff')
    MainApp(win)
    win.mainloop()
    

如果您需要了解其他任何信息,请告诉我或查看 Github Repository

中的代码

如有任何帮助或建议,我们将不胜感激。您还可以为问题建议一个更好的标题,因为我想不出更好的标题。

谢谢你:)

原因是所有三个帧都在一个列中。由于列在网格中具有统一宽度,如果您使顶部框架变宽,则整个列变宽,这会影响第二个和第三个框架的显示方式。

我的建议是对三个 top-level 帧使用 pack。我会在顶部打包 MenuBar,在底部打包 StBar,然后在中间打包 MidSpace