Tkinter - 几何管理

2024-12-09 08:30:00
admin
原创
153
摘要:问题描述:我看到过很多关于 tkinter 的问题,这些问题通常不是询问代码中的错误,而是询问如何组织我的 GUI。所以我想有一个专注于此的答案,并帮助初学者稍微了解一下。解决方案 1:关于 tkinters 几何管理的基本知识tkinter 的几何管理特点如下:默认情况下,顶层窗口以其自然大小出现在屏幕上,...

问题描述:

我看到过很多关于 tkinter 的问题,这些问题通常不是询问代码中的错误,而是询问如何组织我的 GUI。所以我想有一个专注于此的答案,并帮助初学者稍微了解一下。


解决方案 1:

关于 tkinters 几何管理的基本知识

tkinter 的几何管理特点如下:

默认情况下,顶层窗口以其自然大小出现在屏幕上,该大小由其小部件和几何管理器内部确定。


顶层

您的顶层是您应该回答的第一个问题:

  • wm_geometry:尺寸,在屏幕上的位置?

  • wm_minsize \ wm_maxsize 是否存在最小或最大边界?

  • wm_resizable 是否允许用户调整其大小?

  • wm_attributes 是否有诸如最顶层或全屏之类的属性?

  • pack_propagate \ grid_propagate 忽略子项请求的宽度和高度。

注意:您可以跳过这个问题,让流程决定最终需要什么。


安排孩子

为安排您的孩子,您有 3 种选择,每种选择都旨在满足特定需求:

包装者

pack 命令用于与包装器进行通信,包装器是一个几何管理器,它按照父对象边缘的顺序包装父对象的子对象。

->我使用 pack 在主窗口中快速地将几个小部件排列在一起。

砂矿

布局器是 Tk 的几何管理器。它提供简单的固定窗口布局,您可以指定一个窗口(称为从属窗口)在另一个窗口(称为主窗口)内的准确大小和位置。布局器还提供橡皮页布局,您可以根据主窗口的尺寸指定从属窗口的大小和位置,这样从属窗口就会根据主窗口大小的变化而改变大小和位置。最后,布局器允许您混合这些布局样式,例如,从属窗口具有固定的宽度和高度,但位于主窗口的中心。

->我有时使用 place 来制作单页应用程序或者设置背景图像。

网格员

网格命令用于与网格几何管理器进行通信,该管理器将小部件排列在另一个窗口内的行和列中,该窗口称为几何主窗口(或主窗口)。

->对于包含许多小部件的更复杂的应用程序来说,网格是最佳选择。

因此,在选择其中一位经理之前,您需要回答的问题是,如何以最佳方式组织我的申请?

笔记:

警告:切勿在同一个主窗口中混合使用 grid 和 pack。Tkinter 会很乐意花费余生来协商一个让两个管理器都满意的解决方案。不要等待,请终止应用程序,然后重新查看代码。一个常见的错误是对某些小部件使用错误的父级。

->您可以创建一个嵌套布局,在每个主布局(窗口/框架)中,您都可以自由选择


最重要的功能

每个经理最重要的特征可以帮助回答您的问题。因为您需要知道经理是否可以做您想做的事情。

对于我认为是:

  1. 水平、垂直或两者填充 拉伸从属

  2. 扩展 应该扩展从属服务器以消耗其主服务器中的额外空间。

  3. side 指定从属服务器将针对主服务器的哪一侧进行打包。

  4. 锚点 指定了每个从属设备在其包裹中的位置。

对于位置来说应该是:

  1. relheight -relheight=1.0, -height=-2使从属物体比主物体短 2 个像素。

  2. relwidth -relwidth=1.0, -width=5使从属设备比主设备宽 5 个像素。

  3. relx -relx=0.5, -x=-2将从属设备的左边缘定位到中心左侧 2 个像素处。

  4. depend -rely=0.5, -x=3将从属设备的顶部边缘定位在主设备中心以下 3 个像素处。

对于网格来说,它应该是:

  1. columnspan 插入从属元素,使其占据网格中的 n 列。

  2. rowspan 插入从属,使其占据网格中的 n 行。

  3. 粘性 此选项可用于定位(或拉伸)从属设备在其单元内。

  4. grid_remove 记住该窗口的配置选项

  5. grid_column配置

  6. grid_rowconfigure

对于最后两个选项,我推荐此处的答案。


阅读文档

您可以在此处找到可供使用的工作示例:

在此处输入图片描述

import tkinter as tk

root=tk.Tk()

holderframe = tk.Frame(root,bg='red')
holderframe.pack()

display = tk.Frame(holderframe, width=600, height=25,bg='green')
display2 = tk.Frame(holderframe, width=300, height=145,bg='orange')
display3 = tk.Frame(holderframe, width=300, height=300,bg='black')
display4 = tk.Frame(holderframe, width=300, height=20,bg='yellow')
display5 = tk.Frame(holderframe, bg='purple')


##display_green
display.grid(column = 0, row = 0, columnspan=3)
display.pack_propagate(0) #when using pack inside of the display
#display.grid_propagate(0) #when using grid inside of the display

#left
b =tk.Button(display, width =10,text='b')
b1 =tk.Button(display, width =10,text='b1')

b.pack(side='left')
b1.pack(side='left')
#right
b2 =tk.Button(display, width =20,text='b2')
b2.pack(side='right')
#center
l = tk.Label(display, text ='My_Layout',bg='grey')
l.pack(fill='both',expand=1)

#the order by using pack can be important.
#you will notice if you swip right with center.


##display2_orange
display2.grid(column=0,row=1, sticky='n')
display2.grid_propagate(0)

#column0
lab = tk.Label(display2, text='test2')
lab1 = tk.Label(display2, text='test2')
lab2 = tk.Label(display2, text='test2')
lab3 = tk.Label(display2, text='test2')
lab4 = tk.Label(display2, text='test2')
lab5 = tk.Label(display2, text='test2')
lab6 = tk.Label(display2, text='test2')

lab.grid(column=0,row=0)
lab1.grid(column=0,row=1)
lab2.grid(column=0,row=2)
lab3.grid(column=0,row=3)
lab4.grid(column=0,row=4)
lab5.grid(column=0,row=5)
lab6.grid(column=0,row=6)

#column1
lab10 = tk.Label(display2, text='test2')
lab11 = tk.Label(display2, text='test2')
lab12 = tk.Label(display2, text='test2')
lab13 = tk.Label(display2, text='test2')
lab14 = tk.Label(display2, text='test2')
lab15 = tk.Label(display2, text='test2')
lab16 = tk.Label(display2, text='test2')

lab10.grid(column=2,row=0)
lab11.grid(column=2,row=1)
lab12.grid(column=2,row=2)
lab13.grid(column=2,row=3)
lab14.grid(column=2,row=4)
lab15.grid(column=2,row=5)
lab16.grid(column=2,row=6)

display2.grid_columnconfigure(1, weight=1)
#the empty column gets the space for left and right effect

##display3_black
display3.grid(column=1,row=1,sticky='nswe')
display3.grid_propagate(0)

##display4_yellow
display4.grid(column=0,row=1,sticky='s')
display4.grid_propagate(0)

lab20 = tk.Label(display4, bg='black')
lab21 = tk.Label(display4, bg='red')
lab22 = tk.Label(display4, bg='orange')
lab23 = tk.Label(display4, bg='grey')

lab20.grid(column=0,row=0,sticky='ew')
lab21.grid(column=1,row=0,stick='e')
lab22.grid(column=2,row=0,sticky='e')
lab23.grid(column=3,row=0,stick='ew')

display4.grid_columnconfigure(0, weight=4)
display4.grid_columnconfigure(1, weight=2)
display4.grid_columnconfigure(2, weight=2)
display4.grid_columnconfigure(3, weight=1)

##display5_purple
display5.place(x=0,y=170,relwidth=0.5,height=20)
display5.grid_propagate(0)


root.mainloop()
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1579  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1355  
  信创产品在政府采购中的占比分析随着信息技术的飞速发展以及国家对信息安全重视程度的不断提高,信创产业应运而生并迅速崛起。信创,即信息技术应用创新,旨在实现信息技术领域的自主可控,减少对国外技术的依赖,保障国家信息安全。政府采购作为推动信创产业发展的重要力量,其对信创产品的采购占比情况备受关注。这不仅关系到信创产业的发展前...
信创和国产化的区别   8  
  信创,即信息技术应用创新产业,旨在实现信息技术领域的自主可控,摆脱对国外技术的依赖。近年来,国货国用信创发展势头迅猛,在诸多领域取得了显著成果。这一发展趋势对科技创新产生了深远的推动作用,不仅提升了我国在信息技术领域的自主创新能力,还为经济社会的数字化转型提供了坚实支撑。信创推动核心技术突破信创产业的发展促使企业和科研...
信创工作   9  
  信创技术,即信息技术应用创新产业,旨在实现信息技术领域的自主可控与安全可靠。近年来,信创技术发展迅猛,对中小企业产生了深远的影响,带来了诸多不可忽视的价值。在数字化转型的浪潮中,中小企业面临着激烈的市场竞争和复杂多变的环境,信创技术的出现为它们提供了新的发展机遇和支撑。信创技术对中小企业的影响技术架构变革信创技术促使中...
信创国产化   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用