tkinter gui 使用框架和网格布局

2025-02-18 09:24:00
admin
原创
29
摘要:问题描述:我的GUI 布局 看起来几乎与我预期的完全不同所以我认为有一些基本知识我还不了解。我假设框架包含自己的“网格空间”(行、列),但我看到的行为却与此不符,我不知道如何让顶部框架按照我想要的方式工作。我的标签应该位于从左到右的同一行上,位于横跨整个框架的“框架标签”下 - 但事实并非如此。我希望实际看起...

问题描述:

我的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。这会导致您认为将进入顶部框架的每个小部件实际上进入根窗口。

解决方案概述

作为一般经验法则,您永远不应在创建小部件的同一语句中调用gridpackplace部分原因是您遇到的正是这种行为,但也因为我认为随着时间的推移,这会使您的代码更难编写和更难维护。

小部件创建和小部件布局是两回事。根据我的经验,将布局命令组合在一起时,布局问题会更容易调试。

此外,您在使用时应保持一致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()
相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1325  
  IPD(Integrated Product Development)流程作为一种先进的产品开发管理模式,在众多企业中得到了广泛应用。它涵盖了从产品概念产生到产品退市的整个生命周期,通过整合跨部门团队、优化流程等方式,显著提升产品开发的效率和质量,进而为项目的成功奠定坚实基础。深入探究IPD流程的五个阶段与项目成功之间...
IPD流程分为几个阶段   4  
  华为作为全球知名的科技企业,其成功背后的管理体系备受关注。IPD(集成产品开发)流程作为华为核心的产品开发管理模式,其中的创新管理与实践更是蕴含着丰富的经验和深刻的智慧,对众多企业具有重要的借鉴意义。IPD流程的核心架构IPD流程旨在打破部门墙,实现跨部门的高效协作,将产品开发视为一个整体的流程。它涵盖了从市场需求分析...
华为IPD是什么   3  
  IPD(Integrated Product Development)研发管理体系作为一种先进的产品开发模式,在众多企业的发展历程中发挥了至关重要的作用。它不仅仅是一套流程,更是一种理念,一种能够全方位提升企业竞争力,推动企业持续发展的有效工具。深入探究IPD研发管理体系如何助力企业持续发展,对于众多渴望在市场中立足并...
IPD管理流程   3  
  IPD(Integrated Product Development)流程管理旨在通过整合产品开发流程、团队和资源,实现产品的快速、高质量交付。在这一过程中,有效降低成本是企业提升竞争力的关键。通过优化IPD流程管理中的各个环节,可以在不牺牲产品质量和性能的前提下,实现成本的显著降低,为企业创造更大的价值。优化产品规划...
IPD流程分为几个阶段   4  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用