树状数据这里指的是,类似文件夹的层级目录一样
# 创建表格
tree = ttk.Treeview(window)
tree.pack()
# 添加一级树枝
treeA1 = tree.insert('', 0, '浙', text='浙江', values=('A1'))
treeA2 = tree.insert('', 1, '鲁', text='山东', values=('A2'))
treeA3 = tree.insert('', 2, '苏', text='江苏', values=('A3'))
# 添加二级树枝
treeA1_1 = tree.insert(treeA1, 0, 'H', text='杭州', values=('A1_1'))
treeA1_2 = tree.insert(treeA1, 1, 'Z', text='舟山', values=('A1_2'))
treeA1_3 = tree.insert(treeA1, 2, 'J', text='嘉兴', values=('A1_3'))
treeA2_1 = tree.insert(treeA2, 0, 'N', text='济南', values=('A2_1'))
treeA2_2 = tree.insert(treeA2, 1, 'L', text='临沂', values=('A2_2'))
treeA2_3 = tree.insert(treeA2, 2, 'Q', text='青岛', values=('A2_3'))
treeA2_4 = tree.insert(treeA2, 3, 'Y', text='烟台', values=('A2_4'))
# 三级树枝
treeA1_1_1 = tree.insert(treeA1_1, 0, 'G', text='江干', values=('A1_1_1'))
treeA1_1_1 = tree.insert(treeA1_1, 1, 'X', text='萧山', values=('A1_1_2'))
注意事项
-
insert
: 参数介绍
- 参数1: 上一层级的目录
- 参数2: 当前数据在当前层级的中的索引值
- 参数3: 当前数据的标识, 所有层及数据的该标识不能相同, 否则报错
- 参数4: 显示的数据
- 注: 所有数据的参数3(标识)不能相同
效果图如下
绝对布局: 窗口的变化对位置没有影响
这里先介绍
place
布局涉及到的相关属性和函数
1-1. 属性介绍
属性名属性简析取值取值说明
bordermode
如果设置为
INSIDE
,组件内部的大小和位置是相对的,不包括边框;如果是
OUTSIDE
,组件的外部大小是相对的,包括边框
INSIDE
(默认)、
OUTSIDE
可以使用常量
INSIDE
、
OUTSIDE
,也可以使用字符串形式
inside
、
outside
# 创建四个label
label1 = Label(window, text='11111', bg='red')
label2 = Label(window, text='22222', bg='yellow')
label3 = Label(window, text='33333', bg='blue')
label4 = Label(window, text='44444', bg='orange')
# 绝对布局
label1.place(x=10, y=10, width=200)
label2.place(x=30, y=30)
label3.place(x=60, y=61)
label4.place(x=91, y=91, width=200, height=50)
如下图组件位置固定
1-2. 相关函数
place
类提供了下列函数(使用组件实例对象调用)
place_slaves()
: 以列表方式返回本组件的所有子组件对象
place_configure(option=value)
: 给
place
布局管理器设置属性,使用属性
option=value
方式设置
propagate(boolean)
: 设置为
True
表示父组件的几何大小由子组件决定(默认值),反之则无关
place_info()
: 返回
place
提供的选项所对应得值
grid_forget()
:
Unpack
组件,将组件隐藏并且忽略原有设置,对象依旧存在,可以用
pack(option, …)
,将其显示
location(x, y)
:
x/y
为以像素为单位的点,函数返回此点是否在单元格中,在哪个单元格中。返回单元格行列坐标,(-1, -1)表示不在其中
size()
: 返回组件所包含的单元格,揭示组件大小
2-1. 属性介绍
相对布局: 组件位置或大小的变化会随着窗口的变化而变化
这里先介绍
pack
布局涉及到的相关属性和函数
expand
: 设置组件是否展开,当值为YES时,
side
选项无效。组件显示在父容器中心位置;若
fill
选项为
BOTH
,则填充父组件的剩余空间。默认为不展开
# 创建四个label
label1 = Label(window, text='11111', bg='red')
label2 = Label(window, text='22222', bg='yellow')
label3 = Label(window, text='33333', bg='blue')
label4 = Label(window, text='44444', bg='orange')
label1.pack(side=LEFT, fill=Y)
label2.pack(side=RIGHT, fill=Y)
label3.pack(side=TOP, fill=X)
label4.pack(side=BOTTOM, fill=X)
2-2. 函数介绍
pack
类提供了下列函数(使用组件实例对象调用)
-
pack_slaves()
: 以列表方式返回本组件的所有子组件对象
-
pack_configure(option=value)
: 给
pack
布局管理器设置属性,使用属性
option=value
方式设置
-
propagate(boolean)
: 设置为 True 表示父组件的几何大小由子组件决定(默认值),反之则无关。
-
ack_info()
: 返回pack提供的选项所对应得值。
-
pack_forget()
:
Unpack
组件,将组件隐藏并且忽略原有设置,对象依旧存在,可以用
pack(option, …)
,将其显示。
-
location(x, y)
: x, y为以像素为单位的点,函数返回此点是否在单元格中,在哪个单元格中。返回单元格行列坐标,(-1, -1)表示不在其中
-
size()
: 返回组件所包含的单元格,揭示组件大小
grid
布局又被称作网格布局,是最被推荐使用的布局。
程序大多数都是矩形的界面,我们可以很容易把它划分为一个几行几列的网格,然后根据行号和列号,将组件放置于网格之中
使用
grid
布局时,需要在里面指定两个参数,分别用
row
表示行,
column
表示列
需要注意的是
row
和
column
的序号都从0开始
3-1. 属性介绍
属性名属性简析取值取值说明
# 创建四个label
label1 = Label(window, text='11111', bg='red')
label2 = Label(window, text='22222', bg='yellow')
label3 = Label(window, text='33333', bg='blue')
label4 = Label(window, text='44444', bg='orange')
label1.grid(row=0, column=0)
label2.grid(row=0, column=1)
label3.grid(row=1, column=0)
label4.grid(row=1, column=1)
3-2. 函数介绍
grid
类提供了下列函数(使用组件实例对象调用):
函数名描述
grid_slaves()
以列表方式返回本组件的所有子组件对象。
grid_configure(option=value)
给
grid
布局管理器设置属性
grid_propagate(boolean)
设置为
True
表示父组件的几何大小由子组件决定(默认值),反之则无关。
grid_info()
返回
grid
提供的选项所对应得值。
grid_forget()
将组件隐藏并且忽略原有设置,对象依旧存在
grid_location(x, y)
x/y
为以像素为单位的点,函数返回此点是否在单元格中
size()
返回组件所包含的单元格,揭示组件大小
一个
Tkinter
应用生命周期中的大部分时间都处在一个消息循环中
它等待事件的发生: 事件可能是按键按下, 鼠标点击, 鼠标移动等.
Tkinter
提供了用以处理相关事件的机制, 处理函数可以被绑定给各个控件的各种事件
如果相关事件发生,
handler
函数会被触发, 事件对象
event
会传递给
handler
函数
button.bind(event, handler)
label = Label(window, text='https://www.titanjun.top', bg='orange')
label.place(x=100, y=50, height=30)
def labelAction(event):
print(event.x, event.y)
label.bind('<ButtonRelease-1>', labelAction)
其中
event
的事件类型和描述如下
EventDescription
<ButtonRelease-1>
释放鼠标左键
<ButtonRelease-3>
释放鼠标右键
<ButtonRelease-2>
释放鼠标中键
需要注意的是
- 以上鼠标操作中, 苹果鼠标没有中键这一说, 所以在苹果鼠标操作中
- 正常鼠标的中键操作(例如
<Button-2>
等
-2
操作), 响应苹果鼠标的右键操作
- 正常鼠标的右键操作(例如
<Button-3>
等
-3
操作), 在苹果鼠标中无响应