如何在tkinter中显式调整框架大小?

4

我目前正在开发一段代码,将集成到其他东西中作为设置配置器。暂时,我想要一个窗口,布局如下所示:

Layout

其中每个带颜色的框都是一个框架。这个窗口不能调整大小,它的大小总是480x720像素。因此,我希望我使用的3个框架,即侧边栏(黄色)、容器(蓝色)和静态框(红色),始终保持相同的大小并填充窗口,就像上面的图片一样,大致比例相同(不需要完全一样)。

以下是这个窗口的代码:

        self.window = tk.Tk()

        self.windowHeight = 480
        self.windowLength = 720
        self.windowDimensions = str(self.windowLength)+"x"+str(self.windowHeight) #make diemnsions string; dimensions are set as a single string
        self.window.geometry(self.windowDimensions)
        self.window.resizable(width=False, height=False)

        self.container = tk.Frame(self.window, relief="sunken", borderwidth=2) #instantiate new window
        self.sideBar = tk.Frame(self.window,  relief="sunken", borderwidth=2)
        self.static = tk.Frame(self.window, relief="sunken", borderwidth=2)

        self.sideBar.grid_propagate(False)
        self.sideBar.grid(row=0, column=0)
        self.container.grid(row=0,column=1)
        self.static.grid(row=5, column=1)


        self.configuratorObject = configuratorObject 

        audioButton = tk.Button(self.sideBar, text="Audio Page", command=lambda: self.raisePage("audioPage"))
        colourButton = tk.Button(self.sideBar, text="Colours", command=lambda: self.raisePage("coloursPage"))
        saveButton = tk.Button(self.static, text = "Save", state="disabled")
        applyButton = tk.Button(self.static, text = "Apply", state="disabled")
        audioButton.pack()
        colourButton.pack()
        saveButton.pack()
        applyButton.pack()

我尝试更改格子的 heightwidth 参数,但它们似乎无效。那么我该如何明确定义帧的布局和大小呢?

感谢任何帮助。


为什么要显式设置大小,而不是让tkinter计算最佳适合大小?另外,为什么要防止用户调整窗口大小? - Bryan Oakley
@BryanOakley 如果有办法让tkinter做到这一点,那就太好了,但是我似乎只能使用pack()或grid()来使框架的大小与其内容一样大,而不能填满整个窗口。为了方便使用,我禁止了调整大小。 - carbaretta
防止调整大小与易用性相反。如果用户的分辨率与您不同,或者他们的字体大小不同,或者他们的视力比您差,他们可能无法使用窗口。 - Bryan Oakley
@BryanOakley 我明白,不过现在我正在寻找解决办法,谢谢。 - carbaretta
1个回答

6
在你的评论中,你写道
如果有办法让tkinter做到这一点,那就太好了。
那绝对是首选的方式,而不是强制窗口小部件成为特定大小。
我们将首先使用pack而不是grid来处理这三个框架。 对于这样一个基本布局,需要比grid更少的代码行。
self.sideBar.pack(side="left", fill="y")
self.static.pack(side="bottom", fill="x")
self.container.pack(side="top", fill="both", expand=True)

接下来,在左侧添加按钮。这将导致左边的框架缩小以适应按钮。因为我们使用了 fill="y",所以高度将被强制保持窗口的完整高度。
audioButton.pack(side="top", fill="x")
colourButton.pack(side="top", fill="x")

最后,在底部添加按钮。您原始的代码显示它们从上到下堆叠,但您的示例图中显示它们在一行水平排列。此示例遵循示例图。

applyButton.pack(side="right", padx=10)
saveButton.pack(side="right", padx=10)

如此一来,我们得到了一个窗口,看起来像下面这样,当你调整窗口大小时,比例和方向保持完全不变:

screenshot


注意:你也可以使用 grid 实现这一点,但需要更多的代码行将权重应用于行和列。我个人喜欢pack,特别是当布局不能自然地适应网格时,因为它需要更少的代码行。


如果我想仅出于美观的考虑使侧边栏变宽,我该如何操作?我尝试在按钮上使用padx,但这会在按钮边缘和框架之间留下空隙。 - carbaretta
@carbaretta 如果你想要更宽的按钮,一种方法是直接制作更宽的按钮。按钮对象有一个 width 属性。另一种解决方案是使用 packipadx 选项,例如 audioButton.pack(side="top", fill="x", ipadx=20) - Bryan Oakley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接