文章目录:
一.pack()
1.基本用法
2.方位(上下左右中)用法
(1).上下左右
(2).居中放置
3.内边距和外边距
(1).在y轴上
(2).在x轴上
4.真正的上下左右
5.特殊方位
二.grid()
1.堆叠用法
(1).有参数(row,column)
(2).无参数
2.合并用法
三.place()
1.固定位置
2.比例位置
还有很多函数,欢迎补充
附源码(注释已翻译):
pack函数
grid函数
place函数
一.pack()
注意:pack函数是一行一个控件(除fill),所以如果要让多个控件于一行上,请到grid()或place()
1.基本用法
import tkinter as tk #导入tkinter模块
root = tk.Tk() #创建窗口
label_1 = tk.Label(root,text = "我是一个标签") #标签用法见Python tkinter 从入门到放弃标签
label_1.pack()
root.mainloop() #消息循环
pack最基本的用法就是 控件变量.pack(),作用就是居中放置
pack()只在左右居中,没有上下居中
运行程序:
2.方位(上下左右中)用法
(1).上下左右
pack() → pack(tk.N/W/E/S)
import tkinter as tk #导入tkinter模块
root = tk.Tk() #创建窗口
bearing = ["上","左","右","下"]
bearing_p = [tk.N,tk.W,tk.E,tk.S]
#(N:上,W:左,E:右,S:下)
for i in range(4):
label_1 = tk.Label(root,text = f"我是一个{bearing[i]}标签")
label_1.pack(anchor = bearing_p[i])
root.mainloop() #消息循环
因为Label控件里是汉字,所以默认为16像素为一行,如图:
随窗口的大小而改动,但上标签和下标签不行
(2).居中放置
pack() → pack(expand = "yes")
可替换为
“no”或1或0
import tkinter as tk #导入tkinter模块
root = tk.Tk() #创建窗口
bearing = ["上","左","右","下"]
bearing_p = [tk.N,tk.W,tk.E,tk.S]
#(N:上,W:左,E:右,S:下)
for i in range(4):
label_1 = tk.Label(root,text = f"我是一个向{bearing[i]}的标签")
label_1.pack(anchor = bearing_p[i])
if i == 1: #在第二个标签后插入
label_1 = tk.Label(root,text = f"我是一个居中的标签")
label_1.pack(expand = "yes") #可改为"no",1,0
#label_1.pack(expand = "no")
root.mainloop() #消息循环
expand是居中函数
当expand = "yes"或1时,如视频所示:
当expand = "no"或0时,如视频所示:
注意:expand不是整个窗口的中心,而是控件剩余位置的中心
详细参考:小白学tkinter(pack属性fill和expand)_代码_终结者的博客-CSDN博客_pack(fill)
3.内边距和外边距
(1).在y轴上
import tkinter as tk #导入tkinter模块
root = tk.Tk() #创建窗口
label_1 = tk.Label(root,text = f"我是一个标签",bg = "green",fg = "green")
#将label变成一个绿色的矩形
#label_1.pack()
label_1.pack(ipady = 10) #label在y轴上内边距为10像素
label_1.pack(pady = 50) #label在y轴上外边距为50像素
root.mainloop() #消息循环
pack()的大小如图所示:
pack(ipady = 10)#有内边距时大小如图所示:
内边距10像素就是把控件外延10像素
pack(pady = 50)#有外边距时大小如图所示:
不填充控件内容
(2).在x轴上
import tkinter as tk #导入tkinter模块
root = tk.Tk() #创建窗口
label_1 = tk.Label(root,text = f"我是一个标签",bg = "green",fg = "green")
#将label变成一个绿色的矩形
#label_1.pack()
label_1.pack(ipadx = 10) #label在x轴上内边距为10像素
label_1.pack(padx = 50) #label在x轴上外边距为50像素
root.mainloop() #消息循环
pack()的大小如图所示:
pack(ipadx = 10)#有内边距时大小如图所示:
内边距10像素就是把控件外延10像素
pack(padx = 50)#有外边距时大小如图所示:
不填充控件内容
4.真正的上下左右
pack() → pack(side = "top"或“bottom”或"left"或“right”)
#上 下 左 右
import tkinter as tk #导入tkinter模块
root = tk.Tk() #创建窗口
where = ["上","上","下","下","左","左","右","右"]
where_pack = ["top","top","bottom","bottom","left","left","right","right"]
for i in range(len(where)):
label_1 = tk.Label(root,text = f"{where[i]}{i}")
label_1.pack(side = where_pack[i]) #方位
root.mainloop() #消息循环
运行程序:
注意:tk.S不能随窗口大小而改变,但side可以,如视频所示,如果继续编写的话,路径如图所示:
5.特殊方位
pack() → pack(anchor = “方位(英文)”)
import tkinter as tk #导入tkinter模块
root = tk.Tk() #创建窗口
where = ["北","东北","东","东南","南","西南","西","西北"] #方位(text)
pack_where = ["n","ne","e","se","s","sw","w","nw"] #方位(pack())
for i in range(len(where)):
label_1 = tk.Label(root,text = f"{where[i]}")
label_1.pack(anchor = pack_where[i]) #放置
root.mainloop() #消息循环
运行结果:
因为读者可能看不出来,所以改动了一下:
很重要!)
可惜的是它和tk.S一样,上下不能随窗口变化而变化
二.grid()
在学习grid之前,先引用一个知识点:窗口和坐标系;如图所示:
注:窗口的x,y只有正半轴,所以控件位置(x,y)任何一个小于0,控件就会显示不全或不显示
注意:grid()与pack()函数不能同时存在一个代码文件里
1.堆叠用法
(1).有参数(row,column)
import tkinter as tk #导入tkinter模块
root = tk.Tk() #创建窗口
num = 1
for i in range(5):
for j in range(5):
label_1 = tk.Label(root,text = f"标签{num} ")
label_1.grid(row = i,column = j)
#行 #列
num += 1
root.mainloop() #消息循环
运行:
它和pack的区别:pack从窗口坐标((长-标签长)/2,0)开始的,但grid从(0,0)开始的
grid(row = 横排个数,column = 竖排个数)
如图所示:
假如我想找”标签17“的row和column值,就可以按照这个表:
取得"标签17" 的row和column值为(1,3)
注意:row和column用法不会随窗口变化而变化,它只跟所堆叠的控件有关
(2).无参数
import tkinter as tk #导入tkinter模块
root = tk.Tk() #创建窗口
num = 1
for i in range(10):
label_1 = tk.Label(root,text = f"标签{num} ")
label_1.grid() #无参数的grid 就会沿着窗口的y轴排列
num += 1
root.mainloop() #消息循环
运行:
可见,如果grid函数内是空的,就往y轴(colum)堆叠,而x轴(row)终为0
2.合并用法
import tkinter as tk #导入tkinter模块
root = tk.Tk() #创建窗口
num = 1
for i in range(5):
for j in range(5):
label_1 = tk.Label(root,text = f"标签{num} ")
label_1.grid(row = i,column = j,rowspan = 5,columnspan = 5)
num += 1
root.mainloop() #消息循环
运行:
合并控件的个数,columnspan = 在y轴上合并控件的个数)
注意:rowspan和columnspan 都是正整数,不然会报错
(其实作者也不知道这到底有嘛用QAQ)
其他函数如:ipadx,ipady,pads,pady和pack()一样
pach函数用法详见:
一.pack()的使用
三.place()
在学习函数place之前,再引入一个概念:控件坐标
已知控件位置(x,y)中,任何一个参数小于0,这个控件就会显示不全或不显示
所以我们让控件坐标为(0,0)
如图:
可见控件的左上角是控制控件位置的点:
1.固定位置
import tkinter as tk #导入tkinter模块
root = tk.Tk() #创建窗口
label_1 = tk.Label(root,text = "我是一个位于(50,50)的标签")
label_1.place(x = 50,y = 50) #在窗口的(50,50)位置
root.mainloop() #消息循环
运行程序:
可知:place(x = 标签在窗口x轴的位置,y = 标签在窗口y轴的位置) ,如图:
不可以写成place(50,50)
2.比例位置
import tkinter as tk #导入tkinter模块
root = tk.Tk() #创建窗口
label_1 = tk.Label(root,text = "我是一个位于窗口中间的标签")
label_1.place(relx = 0.5,rely = 0.5) #窗口长(宽)与模块位置(x,y)的比值
root.mainloop() #消息循环
relx和rely函数是窗口长(宽)与模块位置(x,y)的比值
因为控件坐标为控件的左上角而不在控件中心,所以看起来模块在窗口的中心偏右下,如图:
图中所示,黑线长度 = 红线长度,绿线长度 = 黄线长度
还有很多函数,欢迎补充
(作者比较懒)
附源码(注释已翻译):
pack函数
class Pack:
"""几何管理器 pack. base 类在每个小部件中使用 pack _ * 方法"""
def pack_configure(self, cnf={}, **kw):
"""在父窗口小部件中打包一个窗口小部件:
after = widget - 装好小部件后再打包
anchor = NSEW (or subset) - 根据给定的方向定位组件
before = widget - 在你打包小工具之前先打包
expand = bool - 如果父大小增加,则展开小部件
fill = NONE 或 X 或 Y 或 BOTH - 如果小部件增长,填充小部件
in = master - 使用 master 来包含这个小部件
in_ = master - 参见‘ in’选项描述
ipadx = amount - 在 x 方向添加内部填充
ipady = amount - 在 y 方向添加内部填充
padx = amount - 在 x 方向添加填充
pady = amount - 在 y 方向添加填充
side = TOP 或 BOTTOM 或 LEFT 或 RIGHT - 在哪里添加这个小部件
"""
self.tk.call(
('pack', 'configure', self._w)
+ self._options(cnf, kw))
pack = configure = config = pack_configure
def pack_forget(self):
"""Unmap this widget and do not use it for the packing order."""
self.tk.call('pack', 'forget', self._w)
forget = pack_forget
def pack_info(self):
"""Return information about the packing options
for this widget."""
d = _splitdict(self.tk, self.tk.call('pack', 'info', self._w))
if 'in' in d:
d['in'] = self.nametowidget(d['in'])
return d
info = pack_info
propagate = pack_propagate = Misc.pack_propagate
slaves = pack_slaves = Misc.pack_slaves
grid函数
class Grid:
"""几何管理器网格。在每个小部件中使用grid_*方法的基类."""
# Thanks to Masazumi Yoshikawa (yosikawa@isi.edu)
def grid_configure(self, cnf={}, **kw):
"""将一个小部件放置在网格中的父小部件中:
column = number - 使用用给定列标识的单元格(从0开始)
columnspan = number - 这个小部件将跨多个列
in = master - 使用 master 来包含这个小部件
in_ = master - 参见‘ in’选项描述
ipadx = amount - 在 x 方向添加内部填充
ipady = amount - 在 y 方向添加内部填充
padx = amount - 在 x 方向添加填充
pady = amount - 在 y 方向添加填充
row = number - 使用用给定行标识的单元格(从0开始)
rowspan = number - 这个小部件将跨几行
sticky = NSEW - 如果单元格较大,这个小部件会贴在单元格边界的哪一边
"""
self.tk.call(
('grid', 'configure', self._w)
+ self._options(cnf, kw))
grid = configure = config = grid_configure
bbox = grid_bbox = Misc.grid_bbox
columnconfigure = grid_columnconfigure = Misc.grid_columnconfigure
def grid_forget(self):
"""映射这个小部件"""
self.tk.call('grid', 'forget', self._w)
forget = grid_forget
def grid_remove(self):
"""取消这个小部件的映射,但记住网格选项。"""
self.tk.call('grid', 'remove', self._w)
def grid_info(self):
"""返回关于在网格中定位此小部件的选项的信息。"""
d = _splitdict(self.tk, self.tk.call('grid', 'info', self._w))
if 'in' in d:
d['in'] = self.nametowidget(d['in'])
return d
info = grid_info
location = grid_location = Misc.grid_location
propagate = grid_propagate = Misc.grid_propagate
rowconfigure = grid_rowconfigure = Misc.grid_rowconfigure
size = grid_size = Misc.grid_size
slaves = grid_slaves = Misc.grid_slaves
place函数
class Place:
"""类在每个小部件中使用 place _ * 方法"""
def place_configure(self, cnf={}, **kw):
"""在父部件中放置一个部件:
in = master - 相对于小部件放置的主控件
in_ = master - 参见‘ in’选项描述
x = amount - 将此小部件的锚定位于主控件的 x 位置
y = amount - 将此小部件的锚定位于主控件的 y 位置
relx = amount - 将此小部件的锚定位于相对于主控宽度(1.0为右边缘)在0.0和1.0之间
rely = amount - 将此小部件的锚定位于相对于主控件高度(1.0为底部边缘)的0.0和1.0之间
anchor = NSEW (或 subset) - 按给定方向定位锚
width = amount - 此小部件的宽度(以像素为单位)
height = amount - 此小部件的高度(以像素为单位)
relwidth = amount - 此小部件的宽度相对于主控件的宽度介于0.0和1.0之间
(1.0与主控件的宽度相同)
relheight = amount - 此小部件的高度相对于 master 的高度介于0.0和1.0之间
(1.0与master的高度相同)
Bordermode = “ inside”或“ outside”-是否考虑主窗口小部件的边框宽度
"""
self.tk.call(
('place', 'configure', self._w)
+ self._options(cnf, kw))
place = configure = config = place_configure
def place_forget(self):
"""取消映射这个小部件"""
self.tk.call('place', 'forget', self._w)
forget = place_forget
def place_info(self):
"""返回有关此小部件的放置选项的信息"""
d = _splitdict(self.tk, self.tk.call('place', 'info', self._w))
if 'in' in d:
d['in'] = self.nametowidget(d['in'])
return d
info = place_info
slaves = place_slaves = Misc.place_slaves