Tkinter - 几何管理

Atl*_*435 6 python layout tk-toolkit tkinter

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

Atl*_*435 10

有关 tkinter 几何管理的基本知识

tkinter 的几何管理的特点是这里引用:

默认情况下,顶级窗口以其自然大小显示在屏幕上,这是由其小部件和几何管理器内部确定的大小。


顶级

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

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


安排孩子

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

打包机

pack 命令用于与打包程序通信,打包程序是一种几何管理器,通过将父项的子项按顺序打包在父项的边缘周围来排列它们。

->我使用 pack 在母版中快速排列一些小部件。

放置者

放置器是 Tk 的几何管理器。它提供了简单的窗口固定放置,您可以在其中指定一个窗口(称为从属窗口)在另一个窗口(称为主窗口)中的确切大小和位置。放置器还提供橡胶板放置,您可以在其中根据主件的尺寸指定从件的尺寸和位置,以便从件改变尺寸和位置以响应主件尺寸的变化。最后,放置器允许您混合这些放置样式,例如,从属器件具有固定的宽度和高度,但位于主器件的中心。

->我有时将 place 用于单页应用程序或设置背景图像。

网格器

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

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

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

笔记

警告:切勿在同一个主窗口中混合网格和包。Tkinter 会很高兴地用你的余生尝试协商一个双方经理都满意的解决方案。不要等待,而是终止应用程序,然后再次查看您的代码。一个常见的错误是对某些小部件使用了错误的父级。

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


最重要的功能

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

对于我认为是:

  1. fill 水平、垂直或同时拉伸从属
  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. 依赖 -rely=0.5, -x=3将从属设备的顶部边缘定位在其主设备中心下方 3 个像素处。

对于网格来说应该是:

  1. columnspan 插入从属设备,使其在网格中占据 n 列。
  2. rowspan 插入从属设备,使其在网格中占据 n 行。
  3. 粘性 此选项可用于在其单元格内定位(或拉伸)从属设备。
  4. grid_remove 记住该窗口的配置选项
  5. 网格列配置
  6. 网格行配置

对于最后两个选项,我在这里推荐这个答案


阅读文档

可以在这里找到一个可以使用的示例:

在此输入图像描述

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()
Run Code Online (Sandbox Code Playgroud)