tkinter gui 使用框架和网格布局
- 2025-02-18 09:24:00
- admin 原创
- 29
问题描述:
我的GUI 布局
看起来几乎与我预期的完全不同
所以我认为有一些基本知识我还不了解。
我假设框架包含自己的“网格空间”(行、列),但我看到的行为却与此不符,我不知道如何让顶部框架按照我想要的方式工作。我的标签应该位于从左到右的同一行上,位于横跨整个框架的“框架标签”下 - 但事实并非如此。我希望实际看起来更像目标 jpg,我想使用网格来实现这一点。
您只能看到绿色框右侧的一个输入字段。它为什么会出现在那里?
from Tkinter import *
root = Tk()
root.title('Model Definition')
root.resizable(width=FALSE, height=FALSE)
root.geometry('{}x{}'.format(460, 350))
top_frame = Frame(root, bg='cyan', width = 450, height=50, pady=3).grid(row=0, columnspan=3)
Label(top_frame, text = 'Model Dimensions').grid(row = 0, columnspan = 3)
Label(top_frame, text = 'Width:').grid(row = 1, column = 0)
Label(top_frame, text = 'Length:').grid(row = 1, column = 2)
entry_W = Entry(top_frame).grid(row = 1, column = 1)
entry_L = Entry(top_frame).grid(row = 1, column = 3)
#Label(top_frame, text = '').grid(row = 2, column = 2)
center = Frame(root, bg='gray2', width=50, height=40, padx=3, pady=3).grid(row=1, columnspan=3)
ctr_left = Frame(center, bg='blue', width=100, height=190).grid(column = 0, row = 1, rowspan = 2)
ctr_mid = Frame(center, bg='yellow', width=250, height=190, padx=3, pady=3).grid(column = 1, row=1, rowspan=2)
ctr_right = Frame(center, bg='green', width=100, height=190, padx=3, pady=3).grid(column = 2, row=1, rowspan=2)
btm_frame = Frame(root, bg='white', width = 450, height = 45, pady=3).grid(row = 3, columnspan = 3)
btm_frame2 = Frame(root, bg='lavender', width = 450, height = 60, pady=3).grid(row = 4, columnspan = 3)
root.mainloop()
那么具体来说,我的标签和 Entry 小部件去哪儿了,以及如何让它们看起来更像目标(顶部框架,其余部分留待以后使用)。
解决方案 1:
我认为框架包含自己的“网格空间”
这是一个正确的假设。
您只能看到绿色框右侧的一个输入字段。它为什么会出现在那里?
问题从这里开始:
top_frame = Frame(root, ...).grid(row=0, ...)
在 Python 中,x = y().z()
将始终设置x
为 的结果.z()
。在 的情况下top_frame = Frame(...).grid(...)
,grid(...)
始终返回 ,None
因此top_frame
将是None
。这会导致您认为将进入顶部框架的每个小部件实际上进入根窗口。
解决方案概述
作为一般经验法则,您永远不应在创建小部件的同一语句中调用grid
或pack
。place
部分原因是您遇到的正是这种行为,但也因为我认为随着时间的推移,这会使您的代码更难编写和更难维护。
小部件创建和小部件布局是两回事。根据我的经验,将布局命令组合在一起时,布局问题会更容易调试。
此外,您在使用时应保持一致grid
,并始终将选项按相同的顺序排列,以便您更轻松地可视化布局。最后,在使用时,grid
您应该养成始终指定选项的习惯sticky
,并始终为每个包含框架中的一行和一列赋予非零权重。
解决方案示例
以下是我编写的代码。虽然很长,但更容易理解。
from Tkinter import *
root = Tk()
root.title('Model Definition')
root.geometry('{}x{}'.format(460, 350))
# create all of the main containers
top_frame = Frame(root, bg='cyan', width=450, height=50, pady=3)
center = Frame(root, bg='gray2', width=50, height=40, padx=3, pady=3)
btm_frame = Frame(root, bg='white', width=450, height=45, pady=3)
btm_frame2 = Frame(root, bg='lavender', width=450, height=60, pady=3)
# layout all of the main containers
root.grid_rowconfigure(1, weight=1)
root.grid_columnconfigure(0, weight=1)
top_frame.grid(row=0, sticky="ew")
center.grid(row=1, sticky="nsew")
btm_frame.grid(row=3, sticky="ew")
btm_frame2.grid(row=4, sticky="ew")
# create the widgets for the top frame
model_label = Label(top_frame, text='Model Dimensions')
width_label = Label(top_frame, text='Width:')
length_label = Label(top_frame, text='Length:')
entry_W = Entry(top_frame, background="pink")
entry_L = Entry(top_frame, background="orange")
# layout the widgets in the top frame
model_label.grid(row=0, columnspan=3)
width_label.grid(row=1, column=0)
length_label.grid(row=1, column=2)
entry_W.grid(row=1, column=1)
entry_L.grid(row=1, column=3)
# create the center widgets
center.grid_rowconfigure(0, weight=1)
center.grid_columnconfigure(1, weight=1)
ctr_left = Frame(center, bg='blue', width=100, height=190)
ctr_mid = Frame(center, bg='yellow', width=250, height=190, padx=3, pady=3)
ctr_right = Frame(center, bg='green', width=100, height=190, padx=3, pady=3)
ctr_left.grid(row=0, column=0, sticky="ns")
ctr_mid.grid(row=0, column=1, sticky="nsew")
ctr_right.grid(row=0, column=2, sticky="ns")
root.mainloop()
结果:
解决方案 2:
variable = Widget(...).grid()
分配None
给变量因为grid()
//返回pack()
`place()`None
使用
variable = Widget(...)
variable.grid() # .pack() .place()
- 2025年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 项目管理必备:盘点2024年13款好用的项目管理软件
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)