这是我关于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()
我所做的只是尝试在根目录中单独布局框架,因为框架将使用不同的管理器。左框的功能完全符合我的要求,中间框也是。问题出在右边的框架上。在
请注意,当您调整窗口大小使其更窄时,右边的框架进入“中间框架的范围”。奇怪的是,中间帧在到达左帧的边界时并没有复制相同的行为。我希望正确的框架和中间框架的行为一样。基本上,我试图使左和右相当静态,但中间帧更动态。谁能告诉我我做错了什么吗?在
关于
pack
需要记住的一点是,side
属性不是指窗口的一侧,而是指剩余可用空间的侧。这使得你打包东西的顺序和你打包它们的那一面非常重要,因为每次你打包东西时,你都会改变剩余可用空间的位置和数量。在在本例中,问题是您没有为中间帧指定
side
属性,因此它默认为"top"
(如“剩余空间顶部”,而不是“窗口顶部”)。左边已经有东西放在左边了。然后,当你把下一个项目放在右边,它在右边,但在上面的东西下面。在至少有几种方法可以解决这个问题。第一种是先包好左右两边,再包中间。在这种情况下,将中间框架放在哪一侧并不重要:
第二种解决方案是将它们保留在原来的顺序上,但将中间框架包装在左侧或右侧,而不是顶部:
^{pr2}$这两个变体最初看起来是相同的,或者可能几乎完全相同,这取决于框架或窗口中的其他内容。但是,当开始使窗口太小而无法容纳所有帧时,行为会有所不同。在
在这种情况下,tkinter最终必须开始减小小部件的大小。它是按相反的顺序包装的(读:最后一个包装的是第一个收缩的)。这意味着,如果你想尽量固定左右两边,你应该最后打包中间部分。在
专业提示:如果你把所有的布局代码组合在一起,你的代码更容易阅读和维护。考虑以下代码:
我想随着时间的推移,你会发现如果你这样写代码,你的代码更容易阅读和维护:
^{4}$我认为这会使代码更容易可视化,因为给定父窗口的所有布局都在一个位置,而不是分散在整个代码中。在
相关问题 更多 >
编程相关推荐