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

2024-09-30 22:23:46 发布

您现在位置:Python中文网/ 问答频道 /正文

这是我关于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()

我所做的只是尝试在根目录中单独布局框架,因为框架将使用不同的管理器。左框的功能完全符合我的要求,中间框也是。问题出在右边的框架上。在

请注意,当您调整窗口大小使其更窄时,右边的框架进入“中间框架的范围”。奇怪的是,中间帧在到达左帧的边界时并没有复制相同的行为。我希望正确的框架和中间框架的行为一样。基本上,我试图使左和右相当静态,但中间帧更动态。谁能告诉我我做错了什么吗?在


Tags: text框架rootfillframesidelabelpack
1条回答
网友
1楼 · 发布于 2024-09-30 22:23:46

关于pack需要记住的一点是,side属性不是指窗口的一侧,而是指剩余可用空间的侧。这使得你打包东西的顺序和你打包它们的那一面非常重要,因为每次你打包东西时,你都会改变剩余可用空间的位置和数量。在

在本例中,问题是您没有为中间帧指定side属性,因此它默认为"top"(如“剩余空间顶部”,而不是“窗口顶部”)。左边已经有东西放在左边了。然后,当你把下一个项目放在右边,它在右边,但在上面的东西下面。在

至少有几种方法可以解决这个问题。第一种是先包好左右两边,再包中间。在这种情况下,将中间框架放在哪一侧并不重要:

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

第二种解决方案是将它们保留在原来的顺序上,但将中间框架包装在左侧或右侧,而不是顶部:

^{pr2}$

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

在这种情况下,tkinter最终必须开始减小小部件的大小。它是按相反的顺序包装的(读:最后一个包装的是第一个收缩的)。这意味着,如果你想尽量固定左右两边,你应该最后打包中间部分。在


专业提示:如果你把所有的布局代码组合在一起,你的代码更容易阅读和维护。考虑以下代码:

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

我想随着时间的推移,你会发现如果你这样写代码,你的代码更容易阅读和维护:

^{4}$

我认为这会使代码更容易可视化,因为给定父窗口的所有布局都在一个位置,而不是分散在整个代码中。在

相关问题 更多 >