Tkinter - 几何管理
- 2024-12-09 08:30:00
- admin 原创
- 152
问题描述:
我看到过很多关于 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 会很乐意花费余生来协商一个让两个管理器都满意的解决方案。不要等待,请终止应用程序,然后重新查看代码。一个常见的错误是对某些小部件使用错误的父级。
->您可以创建一个嵌套布局,在每个主布局(窗口/框架)中,您都可以自由选择
最重要的功能
每个经理最重要的特征可以帮助回答您的问题。因为您需要知道经理是否可以做您想做的事情。
对于包我认为是:
水平、垂直或两者填充 拉伸从属
扩展 应该扩展从属服务器以消耗其主服务器中的额外空间。
side 指定从属服务器将针对主服务器的哪一侧进行打包。
锚点 指定了每个从属设备在其包裹中的位置。
对于位置来说应该是:
relheight -relheight=1.0, -height=-2使从属物体比主物体短 2 个像素。
relwidth -relwidth=1.0, -width=5使从属设备比主设备宽 5 个像素。
relx -relx=0.5, -x=-2将从属设备的左边缘定位到中心左侧 2 个像素处。
depend -rely=0.5, -x=3将从属设备的顶部边缘定位在主设备中心以下 3 个像素处。
对于网格来说,它应该是:
columnspan 插入从属元素,使其占据网格中的 n 列。
rowspan 插入从属,使其占据网格中的 n 行。
粘性 此选项可用于定位(或拉伸)从属设备在其单元内。
grid_remove 记住该窗口的配置选项
grid_column配置
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()