padx值似乎会影响tkinter帧的排列

问题描述

因此,请看下面的图片

tk Window

在这个窗口上,我有3个帧,它们实际上是从tk.Frame继承的(我认为在这里没有什么不同)。

一个框架位于顶部,具有3个按钮,程序的后续部分将添加另外1个。第二个框架由这9个按钮组成3x3布局。 并且第3帧有一个标签(我实际上想在下面放两个标签一个标签在左侧,一个标签在右侧)。

我想要实现的是保持第一帧不变,第二帧中的3x3布局必须位于中心(至少水平),第三帧中的标签位于最左侧,另一个(尚未添加)到绝对正确的位置。

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

这里是让您了解更多问题的最小重复示例

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)


class Midspace(tk.Frame):
    def __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',fg='#fff')
        self.statb.grid(row=0,column=1,sticky=tk.N + tk.S)

        self.resb = tk.Button(self.MenuBar,text='Results',fg='#fff')
        self.resb.grid(row=0,column=2,sticky=tk.N + tk.S)

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

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

        self.b1.grid(row=0,ipadx=40,ipady=40)
        self.b2.grid(row=0,ipady=40)
        self.b3.grid(row=0,ipady=40)
        self.b4.grid(row=1,ipady=40)
        self.b5.grid(row=1,ipady=40)
        self.b6.grid(row=1,ipady=40)
        self.b7.grid(row=2,ipady=40)
        self.b8.grid(row=2,ipady=40)
        self.b9.grid(row=2,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

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

谢谢:)

解决方法

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

我的建议是将pack用于三个顶层框架。我将MenuBar放在顶部,StBar放在底部,然后将MidSpace放在中间。