如何解决如何组织我的Tkinter申请?
我看到并看到很多有关tkinter的问题,这些问题通常不询问其代码中的错误,而是询问如何组织我的GUI。因此,我想给出一个针对此问题的答案,并帮助初学者稍微调整一下方向。
解决方法
关于tkinters几何管理的基本知识
tkinter的几何管理的特征是引用here:
默认情况下,顶层窗口以其自然大小显示在屏幕上,该窗口大小由窗口小部件和几何图形管理器内部确定。
Toplevels
您的最高级别是您必须回答的第一个问题:
- wm_geometry:大小,在屏幕上的位置?
- wm_minsize \ wm_maxsize 边界最小还是最大?
- wm_resizable 用户是否可以调整其大小?
- wm_attributes 是否有诸如顶部或全屏显示之类的属性?
- pack_propagate \ grid_propagate 固定大小,与包含的小部件无关
注意: 您可以跳过此问题,然后由流程来决定需要什么。
安排孩子
要安排孩子,您有3个选择,每个选择都是为了满足特定需求:
pack命令用于与打包机(几何图形)进行通信 通过包装父母来安排父母子女的经理 围绕父母的边缘排序。
-> 我使用包快速在主数据库中彼此并排放置一些小部件。
放置器是Tk的几何管理器。它提供简单的固定 窗户的位置,您可以在其中指定确切的尺寸和位置 一个窗口,称为从窗口,另一个窗口,称为窗口 主。放置器还提供橡胶板放置, 根据尺寸指定从站的大小和位置 主机的状态,以便从机响应时更改大小和位置 更改母版的大小。最后,放置器允许您 混合使用这些样式的放置,例如,从属具有 固定的宽度和高度,但在母版内部居中。
-> 有时我将位置用于One-Sheet应用程序或设置背景图像。
grid命令用于与网格几何管理器进行通信 将小部件排列在另一个窗口内的行和列中, 称为几何图形母版(或母版窗口)。
-> 网格是包含许多小部件的更复杂应用程序的最佳选择。
因此,在选择这些经理之一之前,您需要在这里回答的问题是,如何以最佳方式组织我的应用程序?
Note:
警告:切勿在同一主窗口中混合网格和打包。 Tkinter 会很乐意度过余生,尝试谈判 两位经理都满意的解决方案。不用等待,杀死 该应用程序,然后再看一下您的代码。一个常见的错误 是为某些小部件使用错误的父级。
-> 您可以创建一个嵌套布局,在每个主窗口(窗口/框架)中自由选择
最重要的功能
每个管理器的大多数重要功能都可以帮助回答您的问题。因为您将需要知道经理是否可以做您想做的事。
对于 pack ,我认为是:
- fill 水平,垂直或同时伸展两个奴隶
- expand 应该扩展从属服务器,以占用其主服务器的额外空间。
- side 指定从站要针对哪个主站进行打包。
- anchor 它指定将每个从站放置在其包裹中的位置。
对于地点,应该为:
- relheight -relheight = 1.0,-height = -2 使从属节点比主节点短2个像素。
- relwidth -relwidth = 1.0,-width = 5 使从属节点比主节点宽5像素。
- relx -relx = 0.5,-x = -2 将从属设备的左边缘定位在距中心左侧2个像素的位置。
- rely -rely = 0.5,-x = 3 将从属设备的顶部边缘定位在其主控中心下方3个像素。
对于网格,应为:
- columnspan 插入从属设备,使其在网格中占据n列。
- rowspan 插入从属设备,使其在网格中占据n行。
- sticky 此选项可用于在从属单元中定位(或拉伸)从属单元。
- grid_remove 该窗口的配置选项被记住
- grid_columnconfigure
- grid_rowconfigure
对于最后两个选项,我推荐这个answer here。
可以在这里找到可以使用的工作方言书:
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,height=300,bg='black')
display4 = tk.Frame(holderframe,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,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,sticky='nswe')
display3.grid_propagate(0)
##display4_yellow
display4.grid(column=0,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,stick='e')
lab22.grid(column=2,sticky='e')
lab23.grid(column=3,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()