Tkinter - 几何管理

2024-12-09 08:30:00
admin
原创
151
摘要:问题描述:我看到过很多关于 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大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用