我正在玩Tkinter为这些帧添加帧和标签。请找到以下代码:
from Tkinter import *
root = Tk()
root.title('Example of Tkinter module')
root.geometry('{}x{}'.format(800,600))
frame_top = Frame(root, width=800, height=120, bg="#154e72")
frame_left = Frame(root, width=240, height=420, bg="#154e72")
frame_right = Frame(root, width=550, height=420, bg="#9dc8e3")
frame_bottom = Frame(root, width=800, height=50, bg="#154e72")
root.grid_rowconfigure(1,weight=1)
root.grid_columnconfigure(0,weight=1)
frame_top.grid (row=0,sticky="ew")
frame_left.grid (row=1,sticky="w")
frame_right.grid(row=1,sticky="e")
frame_bottom.grid(row=2,sticky="ew")
label_1 = Label(frame_top, text="text label",bg="#154e72")
frame_top.grid_rowconfigure(1,weight=1)
frame_top.grid_columnconfigure(0,weight=1)
#label_1.grid(sticky="w")
root.mainloop()
如果代码运行时注释了label_1.grid(sticky =“w”)行,则结果为:
如果我尝试显示标签,事情会发生如下变化:
我做错了什么? Python版本2.7.11。我也尝试打包它,结果相同。
编辑:
在我思考之前就像我发布的那样,我基本上省略了真正的问题。在这里:
如何将标签放在 frame_top 中并保持帧高约120px?
答案 0 :(得分:0)
原因是由于tkinter"缩小以适应"行为。当您向顶部框架添加标签时,顶部框架将自行调整大小以使其足够高以适合其内容。如果删除标签但将顶部框架的高度设置为25,则可以获得完全相同的视觉行为。
当顶部框架重置为较小的高度时,所有额外空间都分配给第1行(根据您的重量选项)。由于您将框架放置在第1排中并且因为它们不够高以填充空间,并且因为它们不会粘在空间的顶部或底部,所以它们似乎漂浮在中间第1行。
如果您的主要目标是简单地设置一个居中的标签(基于对此答案的评论),则可以在使用pack
或grid
时向标签添加一些填充。您的另一个选择是使用place
,它没有"缩小以适应"行为。
这是一个使用pack
的解决方案,对于您真的不关心该区域的确切高度,只关心一点垂直填充的情况:
label_1.pack(side="top", pady=50)
如果您的要求确实是要有一个120像素高的顶部区域,并且您需要一个以该区域为中心的标签,place
是一个不错的选择,因为它允许相对位置:
label_1.place(relx=.5, rely=.5)
答案 1 :(得分:0)
考虑到以下注意事项,您可以将frame_top的高度保持为120:
root
的高度为600,但其他框架的高度总和为420 + 120 + 50 = 590 root
的宽度为800,而左右框架的宽度总和为550 + 240 = 790 现在您需要进行以下调整:
因此,您可以为每个width=5
添加两个水平框架。一个位于frame_top
之下,另一个位于frame_bottom
之上。
您可以创建最后一帧,占据10像素宽度,将frame_left
和frame_right
分开。
您必须对columnspan
和frame_top
使用frame_buttom
选项
不要忘记指定其余帧的列号。
完成逻辑构建和调整后,您必须在frame_top
上应用grid_propagate()
方法。
以下是将上面提到的元素放在一起的完整解决方案:
from Tkinter import *
root = Tk()
root.title('Example of Tkinter module')
root.geometry('{}x{}'.format(800,600))
frame_top = Frame(root, width=800, height=120, bg="#154e72")
frame_left = Frame(root, width=240, height=420, bg="#154e72")
frame_right = Frame(root, width=550, height=420, bg="#9dc8e3")
frame_bottom = Frame(root, width=800, height=50, bg="#154e72")
horizontal_frame_1 = Frame(root, width=800, height=5)
horizontal_frame_1.grid(row=1, columnspan=2, sticky='ew')
root.grid_rowconfigure(1,weight=1)
root.grid_columnconfigure(0,weight=1)
frame_top.grid (row=0, columnspan=3, sticky="ew")
vertical_frame = Frame(root, width=10, height=420)
vertical_frame.grid(row=2, column=1)
frame_left.grid (row=2, column=0, sticky="w")
frame_right.grid(row=2, column=2, sticky="e")
horizontal_frame_2 = Frame(root, width=800, height=5)
horizontal_frame_2.grid(row=3, columnspan=3)
frame_bottom.grid(row=4, columnspan=3, sticky="ew")
label_1 = Label(frame_top, text="text label",bg="#154e72")
label_1.grid(sticky="w")
frame_top.grid_propagate(0)
root.mainloop()
这就是你一直在寻找的东西: