如何在使用tkinter和pack重新调整python中具有框架的窗口时冻结窗格?

时间:2016-05-18 19:03:53

标签: python tkinter resize frame pack

这是我在stackoverflow上的第一篇文章。我终于发帖了,因为我无法在任何地方找到这个并且已经搜索了近4个小时,但我被卡住了。

这是我的代码示例:

import tkinter as tk
from tkinter import *
root = tk.Tk()
root.geometry("600x100+200+200")
leftverticalFrame = Frame(root)
leftverticalFrame.pack(side=LEFT)
middleverticlFrame = Frame(root)
middleverticlFrame.pack(expand=TRUE)
rightverticalFrame = Frame(root)
rightverticalFrame.pack(side=RIGHT)

right = tk.Label(rightverticalFrame, text="Right Vertical Status Frame", bg="yellow")
right.pack(side=tk.RIGHT, fill=BOTH)

left = tk.Label(leftverticalFrame, text = "Left Vertical Navigation Frame", bg="orange")
left.pack(side=tk.LEFT, fill=BOTH)

bottom = tk.Label(middleverticlFrame, text="Middle Vertical Frame", bg="blue")
bottom.pack(side=tk.BOTTOM, expand=True, fill=tk.BOTH)

root.mainloop()

我正在做的只是尝试在根目录中单独布局框架,因为框架将使用不同的管理器。左框架的功能与我想要的完全一样,中间框架也是如此。问题在于右边的框架。

注意当您重新调整窗口大小使其更窄时,右框架会进入“中间框架的区域”。现在奇怪的是,当涉及到左边框的边界时,中间框架不会复制相同的行为。我希望右框架的行为与中间框架相同。本质上我试图使左和右相当静态,但中间框架更动态。谁能告诉我,我做错了什么?

1 个答案:

答案 0 :(得分:0)

关于pack要记住的一件重要事情是,side属性不是指向窗口的一侧,而是指剩余可用空间的侧< / em>的。导致包装物品的顺序和包装物品的一面变得非常重要,因为每次包装物品都会改变剩余可用空间的位置和数量。

在这种情况下,问题是您没有为中间框架指定side属性,因此默认为"top"(如,&#34;顶部的剩余空间&#34;,&#34;窗口顶部&#34;)。由于左侧已有东西,因此将其置于右侧剩余空间的顶部。然后,当您将下一个项目放在右侧时,它位于右侧但位于顶部的物体下方。

至少有几种方法可以解决这个问题。首先是首先打包左侧和右侧,然后打包中间。在这种情况下,放置中间框架的哪一方并不重要:

leftverticalFrame.pack(side=LEFT)
rightverticalFrame.pack(side=RIGHT)
middleverticlFrame.pack(expand=TRUE, side=TOP)

第二个解决方案是按原始顺序保留它们,但是将中间框架打包在左侧或右侧而不是顶部:

leftverticalFrame.pack(side=LEFT)
middleverticlFrame.pack(expand=TRUE, side=LEFT)
rightverticalFrame.pack(side=RIGHT)

这两种变体最初看起来相同,或者几乎相同,具体取决于框架或窗口中的其他内容。但是,当您开始使窗口太小而无法容纳所有帧时,行为会有所不同。

在这种情况下,tkinter最终必须开始减小窗口小部件的大小。它按照它们打包的相反顺序执行此操作(读取:要打包的最后一个是要收缩的第一个)。这意味着如果你想要尽可能多地修复左边和右边,你应该最后打包中间部分。

专业提示:如果将所有布局代码组合在一起,它可以使您的代码更易于阅读和维护。请考虑以下代码:

f1 = Frame(...)
f1.pack(...)
f2 = Frame(...)
f2.pack(...)

我认为,如果你这样编写代码,你会发现你的代码更容易阅读和维护:

f1 = Frame(...)
f2 = Frame(...)
...
f1.pack(...)
f2.pack(...)
...

我认为它使代码更容易可视化,因为给定父窗口的所有布局都在一个地方而不是遍布整个代码。