Tkinter控件有特定的几何状态管理方法,管理整个控件区域组织,以下是Tkinter公开的几何管理类:包、网格、位置。

几何方法

描述

pack()

包装

grid()

网格

place()

位置

一、pack 包装

(一)pack选项

pack方法会从上到下,从左到右的摆放控件。

python 求物体的几何中心 python几何位置的设置_ide

1.side

side的作用是放置控件的位置。有四个位置:left,right,top,bottom。LEFT:由左往右排列,RIGHT:由右往左排列,TOP:默认值,由上往下排列,BOTTOM:由下往上排列。

import tkinter as tk
init_window = tk.Tk()
init_window.geometry('300x240')
b1 = tk.Label(init_window,text='left')
b1.pack(side = tk.LEFT)
b2 = tk.Label(init_window,text='right')
b2.pack(side = tk.RIGHT)
b3 = tk.Label(init_window,text='top')
b3.pack(side=tk.TOP)
b4 = tk.Label(init_window,text='bottom')
b4.pack(side=tk.BOTTOM)
init_window.mainloop()

python 求物体的几何中心 python几何位置的设置_python 求物体的几何中心_02

2.expand

正常的情况使用pack,此标签就在窗口的顶部居中显示。当expand值为True时,side选项无效。控件显示在父控件中心位置。expand取值:“yes”,“no”,“y”,“n”,“True”,“False”(默认值为"no"或0)

##标签左右、垂直居中
import tkinter
from tkinter import *
init_window = Tk()  ## 实例化出一个父窗口
init_window.geometry('300x240')
label = Label(init_window, text="图像在左",compound="left",bitmap="error")
label.config(font="Helvetic 20 overstrike",cursor="shuttle")
label.pack(expand='yes')
init_window.mainloop()

python 求物体的几何中心 python几何位置的设置_python 求物体的几何中心_03

3.fill

fill 参数的主要功能是告诉 pack管理程序,设置控件填满所分配容器区间的方式
参数:
fill = X:表示控件可以填满所分配空间的X轴不留白
fill = Y:表示控件可以填满所分配空间的Y轴不留白
fill = BOTH:表示控件可以填满所分配空间的X轴和Y轴
fill默认值为NONE,表示保持原大小

import tkinter as tk
init_window = tk.Tk()
init_window.geometry('300x240')
l = tk.Label(init_window,text='这是一个标签',bg='pink')
l.pack(expand='true',fill='x')
init_window.mainloop()

python 求物体的几何中心 python几何位置的设置_ipad_04

4.padx、pady、ipadx、ipady

  • padx:可以设置标签文字左右边界与标签区间的x轴间距。
  • pady:可以设置标签文字上下边界与标签区间的y轴距离。
  • ipadx:标签内部的文字与小框框的水平距离
  • ipady:标签内部的文字与小框框的垂直距离
import tkinter as tk
init_window = tk.Tk()
init_window.geometry('300x240')
l1 = tk.Label(init_window,text='这是一个对照标签',bg='pink')
l1.pack(expand='true')
l2 = tk.Label(init_window,text='标签内部的文字与小框框的距离',bg='blue')
l2.pack(expand='true',ipadx=20,ipady=40)
init_window.mainloop()

python 求物体的几何中心 python几何位置的设置_ipad_05

import tkinter as tk
init_window = tk.Tk()
init_window.geometry('300x240')
b1 = tk.Label(init_window,text='文本1',bg='pink')
b1.pack()
b2 = tk.Label(init_window,text='文本2',bg='pink')
b2.pack(pady=10)
b3 = tk.Label(init_window,text='文本3',bg='pink')
b3.pack(pady=(10,30))
b4 = tk.Label(init_window,text='文本4',bg='pink')
b4.pack()
b5 = tk.Label(init_window,text='文本5',bg='pink')
b5.pack(side='left')
b6 = tk.Label(init_window,text='文本6',bg='pink')
b6.pack(side='left',padx=20)
init_window.mainloop()

python 求物体的几何中心 python几何位置的设置_python 求物体的几何中心_06

5.before、after、in_

before 和after可以改变pack控件的次序。in_的作用是设置当前控件的父控件,可以替换掉在控件初始化时候的父控件。

import tkinter as tk
init_window = tk.Tk()
init_window.geometry('300x240')
b1 = tk.Label(init_window,text='文本1')
b1.pack()
b2 = tk.Label(init_window,text='文本2')
b2.pack()
b3 = tk.Label(init_window,text='文本3被提前到文本2之前pack')
b3.pack(before=b2)
init_window.mainloop()

python 求物体的几何中心 python几何位置的设置_python 求物体的几何中心_07

import tkinter as tk
init_window = tk.Tk()
init_window.geometry('300x240')
b1 = tk.Label(init_window,text='文本1')
b1.pack()
b2 = tk.Label(init_window,text='文本2',bg='blue')
b2.pack()
b3 = tk.Label(init_window,text='文本3被放在文本2中')
b3.pack(in_=b2)
init_window.mainloop()

python 求物体的几何中心 python几何位置的设置_控件_08

(二)pack函数

函数名

描述

slaves()

以列表方式返回本控件的所有子控件对象

propagate(flag)

设置为True表示父控件的几何大小由子控件决定(默认值),反之则无关

info()

返回pack提供的选项所对应的数值,返回值为字典类型

forget()

将控件隐藏并且忽略原有设置,对象依旧存在

pack()

显示控件

1.slaves ()函数

slaves()函数返回本控件的所有子控件对象。如果不使用pack(),就算已经实例化了子控件,slaves()也不会输出没有pack()的子控件。比如b4就不会输出。而b2和b3会被认为是b1的子控件。

import tkinter as tk
init_window = tk.Tk()
init_window.geometry('300x240')
b1 = tk.Label(init_window,text='文本1')
b1.pack()
b2 = tk.Label(b1,text='文本2')
b2.pack()
b3 = tk.Label(b1,text='文本3')
b3.pack()
b4 = tk.Label(b1,text='文本4')
print(b1.slaves())
init_window.mainloop()

python 求物体的几何中心 python几何位置的设置_python 求物体的几何中心_09

2.propagate(flag)函数

该函数决定父控件的大小是否与子控件有关。如果flag是True则父控件的大小为包括子控件的大小。如果flag是False,则表示父控件的大小与子控件无关。不过geometry()会让propagate()失效,窗口的大小由geometry()决定。

import tkinter as tk
init_window = tk.Tk()
b1 = tk.Label(init_window,text='文本1')
b1.pack()
b2 = tk.Label(init_window,text='文本2')
b2.pack()
b3 = tk.Label(init_window,text='文本3')
b3.pack()
init_window.propagate(False)
init_window.mainloop()

python 求物体的几何中心 python几何位置的设置_ide_10

import tkinter as tk
init_window = tk.Tk()
b1 = tk.Label(init_window,text='文本1')
b1.pack()
b2 = tk.Label(init_window,text='文本2')
b2.pack()
b3 = tk.Label(init_window,text='文本3')
b3.pack()
init_window.propagate(True)
init_window.mainloop()

python 求物体的几何中心 python几何位置的设置_python 求物体的几何中心_11

3.info() 函数

info()返回控件的信息。这些信息以字典的形式返回。

import tkinter as tk
init_window = tk.Tk()
b1 = tk.Label(init_window,text='文本1')
b1.pack()
print(b1.info())
init_window.mainloop()

python 求物体的几何中心 python几何位置的设置_ipad_12

4.forget() 函数

forget()函数是隐藏控件的。调用之后,该控件从父控件中消失。但是该控件的实例还是存在的。可以用pack()直接恢复显示这个控件。pack()是按照次序来的。以pack()的次序为准,而不是以实例化的次序。

import tkinter as tk
init_window = tk.Tk()
init_window.geometry('300x240')
b1 = tk.Label(init_window,text='文本1')
b1.pack()
b2 = tk.Label(init_window,text='文本2')
b2.pack()
b3 = tk.Label(init_window,text='文本3')
b3.pack()
def b3_forget():
    b3.forget()
def b3_pack():
    b3.pack()
b4 = tk.Button(init_window,text='隐藏文本3',command=b3_forget)
b4.pack()
b5 = tk.Button(init_window,text='显示文本3',command=b3_pack)
b5.pack()
init_window.mainloop()
#点击’隐藏文本3’按钮后,’文本3’的标签消失。
#再点击’显示文本3’按钮,则显示’文本3’

运行代码

python 求物体的几何中心 python几何位置的设置_python 求物体的几何中心_13


点击隐藏文本

python 求物体的几何中心 python几何位置的设置_python 求物体的几何中心_14


点击显示文本

python 求物体的几何中心 python几何位置的设置_ide_15

二、grid网格

(一)grid选项

grid布局管理采用类似表格的结构来管理控件的,把窗口用单元格的形式来定位,可以像编辑表格一样放置控件。grid采用行列确定位置,行列交汇处为一个单元格。每一列中,列宽由这一列中最宽的单元格确定。每一行中,行高由这一行中最高的单元格决定。

名称

描述

column

控制所置单元格的列号

columnspan

从控件所置单元格算起在列方向上的跨度

row

控制所置单元格的行号

rowspan

从控件所置单元格算起在行方向上的跨度

ipadx、ipady

标签内部的文字与小框框的距离

padx、pady

设置标签文字边界与标签区间的间距

in_

将本控件作为所选组建对象的子控件

sticky

功能类似anchor,但是只可以设定N/S/W/E,即上/下/左/右对齐

注:相同column的Widget 控件,如果宽度不同的话,grid方法会保留最宽的控件当做基准,这时比较短的件会居中对齐。

1.row、column、rowspan、columnspan

import tkinter as tk
init_window = tk.Tk()
init_window.geometry('300x240')
b1 = tk.Label(init_window,text='跨\n两\n行',bg='pink')
b1.grid(row=0,column=0,rowspan=2)
b2 = tk.Label(init_window,text='跨两列',bg='yellow')
b2.grid(row=0 ,column=1,columnspan=2)
b3 = tk.Label(init_window,text='文本3',bg='cyan')
b3.grid(row=1,column=1)
b4 = tk.Label(init_window,text='文本4',bg='cyan')
b4.grid(row=1,column=2)
init_window.mainloop()

python 求物体的几何中心 python几何位置的设置_python 求物体的几何中心_16

2.sticky

sticky的参数可以组合使用

参数

含义

sticky=N+S

可以拉长高度,让控件在顶端和底端对齐

sticky=W+E

可以拉长宽度,让控件在左边和右边对齐

sticky=N+S+E

可以拉长高度,让控件在顶端和底端对齐,同时切齐右边

sticky=N+S+W

可以拉长高度,让控件在顶端和底端对齐,同时切齐左边

sticky=N+S+W+S

可以拉长高度,让控件在顶端和底端对齐,同时切齐左右边

import tkinter as tk
init_window = tk.Tk()
label1 = tk.Label(init_window, text="One", relief="raised")
label2 = tk.Label(init_window, text="TwoTwoTwo", relief="raised")
label1.grid(row=0, column=0, sticky=tkinter.W + tkinter.E)
label2.grid(row=1, column=0)
init_window.mainloop()

python 求物体的几何中心 python几何位置的设置_ipad_17

(二)grid函数

python 求物体的几何中心 python几何位置的设置_ipad_18


python 求物体的几何中心 python几何位置的设置_ide_19

1.forget、remove

forget控件后,不会记住当前位置,重新显示时,会按提交顺序显示。remove控件后,会记住当前位置,重新显示时,还在控件原位置。

import tkinter as tk
init_window = tk.Tk()
init_window.geometry('300x240')
b1 = tk.Label(init_window,text='文本1')
b1.grid(row=0, column=0)
def b1_forget():
    b1.grid_forget()
def b1_grid():
    b1.grid()
def b1_remove():
    b1.grid_remove()
b2 = tk.Button(init_window,text='foget文本',command=b1_forget)
b2.grid(row=1, column=0)
b3 = tk.Button(init_window,text='remove文本',command=b1_remove)
b3.grid(row=2, column=0)
b4 = tk.Button(init_window,text='显示文本1',command=b1_grid)
b4.grid(row=3, column=0)
init_window.mainloop()

代码运行

python 求物体的几何中心 python几何位置的设置_ipad_20


forget

python 求物体的几何中心 python几何位置的设置_ipad_21

python 求物体的几何中心 python几何位置的设置_ide_22


remove

python 求物体的几何中心 python几何位置的设置_控件_23

python 求物体的几何中心 python几何位置的设置_ide_24

2.grid_location(x,y)

返回坐标位置所在的单元格的行列坐标。

import tkinter as tk
init_window = tk.Tk()
init_window.geometry('300x240')
b1 = tk.Canvas(init_window,bg='blue',width=40,height=80)
b1.grid(row=0,column=0,rowspan=2)
b2 = tk.Canvas(init_window,bg='yellow',width=80,height=40)
b2.grid(row=0 ,column=1,columnspan=2)
b3 = tk.Canvas(init_window,bg='cyan',width=40,height=40)
b3.grid(row=1,column=1)
b4 = tk.Canvas(init_window,bg='gray',width=40,height=40)
b4.grid(row=1,column=2)
i=30
j=120
m = init_window.grid_location(i,j)
print("i=",i,"j=",j,m)
init_window.mainloop()

python 求物体的几何中心 python几何位置的设置_控件_25


坐标位置在(30,120)的单元格在第1行,第3列的位置。

3.grid_rowconfigure()、grid_columnconfigure()

在设计控件的布局时,有时候会碰上窗口缩放大小,此时可以使用这两个方法设定第几行row或者是column的缩放比例。

import tkinter as tk
init_window = tk.Tk()
init_window.rowconfigure(1, weight=1)  ## 第二行按比例1缩放
init_window.columnconfigure(0, weight=1)  ## 第一列按比例1缩放

label1 = tk.Label(init_window, text="Label 1", bg="red")
label1.grid(row=0, column=0, padx=5, pady=5, sticky=tkinter.W)

label2 = tk.Label(init_window, text="Label 2", bg="blue")
label2.grid(row=0, column=1, padx=5, pady=5)

label3 = tk.Label(init_window, text="Label 3", bg="green")
label3.grid(row=1, column=0, columnspan=2, padx=5, pady=5, sticky=tkinter.N+tkinter.S+tkinter.W+tkinter.E)

init_window.mainloop()

python 求物体的几何中心 python几何位置的设置_ipad_26

三、place位置

place方法是最简单的一种布局方法,只需指定控件的显示位置即可。

(一)place选项

python 求物体的几何中心 python几何位置的设置_控件_27

1.x、y、relx、rely

x、y指定在何处显示控件。relx和rely也是设定子控件的位置的。不过是相对的位置。取值范围是0~1。如果同时设定了x和y,那么就是把计算出来的相对位置与x,y分别相加,得出来的就是该控件的位置。
比如x=50,y=50,relx=0.5,rely=0.5,而父控件的大小是280和230(必须设定父控件的大小。否则,不会显示子控件),那么该控件的位置就是:
x = 50 + 2800.5 = 50+140 = 190
y = 50 + 230
0.5 = 50+115 = 165

(二)place函数

python 求物体的几何中心 python几何位置的设置_控件_28