【问题标题】:padx values seem to affect the arrangement of tkinter Framespadx 值似乎会影响 tkinter 帧的排列
【发布时间】:2020-12-21 16:16:35
【问题描述】:

请看下图。

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

第一帧在顶部,有 3 个按钮,另外 1 个将在程序的后面部分添加。第二帧由 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

感谢任何帮助或建议。你也可以为这个问题建议一个更好的标题,因为我想不出更好的了。

谢谢你:)

【问题讨论】:

  • 请尝试将此代码压缩为完整的minimal reproducible example。我们很难知道如何将这些代码块拼接在一起以运行它。
  • @Bryan 我已按照建议编辑了问题。请立即检查。
  • 您将网格用于最顶部的帧是否有特定原因?您是否打算将其他小部件放在其他列中?
  • 并非如此。我使用网格只是为了能够执行 grid_rowconfigure(),因为我需要不同框架的高度(当然,MenuBar 和 StBar 的高度将低于 MidSpace,因为中间空间将有那些 3x3 按钮)。而且我需要这 3 个框架来占据窗口的完整宽度和高度(它们的宽度必须相同 - 等于根窗口的宽度)所以只要满足这个条件,我绝对可以也可以使用 pack() (我知道实际上推荐用于框架)。

标签: python tkinter layout frames


【解决方案1】:

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

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

【讨论】:

  • 好吧,这实际上解释了我关于网格 GeoManager 的长期问题之一。我试试那个 rn。
  • 成功了,谢谢。我只需要添加锚来实现我真正想要的,而且效果很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-12
  • 1970-01-01
  • 2012-01-03
  • 2012-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多