当前位置:首页 » tkinter » 正文

tkinter.ttk的Treeview组件超详细讲解

以一个源码案例讲解Treeview组件的结构

我今天来讲一个Treeview组件,这个ttk组件要学的知识点比较多,我这次从我做的一段代码来讲解。

下面我做的一个基础代码,大家运行一下,知道程序的运行的情况后,再看我的讲解。

from tkinter import *
from tkinter.ttk import *
 
root = Tk()
 
tree1 = Treeview(root, columns=('qy', 'dz')) 
# 创建树表格组件,栏目有3个:#0, qy, dz
 
tree1.column('#0', width=90, anchor=CENTER,stretch=False) 
tree1.column('qy', width=90, anchor=CENTER)
tree1.column('dz', width=160, anchor=CENTER)
# 定义3个栏目的宽度,对齐方法,宽度是否窗体变化
 
tree1.heading('#0', text='')
tree1.heading('qy', text='区域')
tree1.heading('dz', text='地址')
# 定义3个栏目的表头文字
 
sf1 = tree1.insert('', END, text='广东',open=True)
sf2 = tree1.insert('', END, text='湖南',open=True)
# 在根节点‘’下添加2个子节点:广东,湖南
 
tree1.insert(sf1, END, text='广州市',values=('海珠区','阅江中路380号'))
tree1.insert(sf1, END, text='深圳市',values=('南山区','华侨城侨香路11号'))
tree1.insert(sf1, END, text='东莞市',values=('南城区','元美东路3号济亨网'))
# 在广州(sf1)节点下,插入3条记录:#0栏 = text,其它栏 = values()
 
tree1.insert(sf2, END, text='长沙市',values=('雨花区','韶山中路108号'))
tree1.insert(sf2, END, text='湘潭市',values=('岳塘区','书院路42号云峰工作室'))
tree1.insert(sf2, END, text='衡阳市',values=('蒸湘区','祝融路名都花园B9栋107室'))
# 在湖南(sf2)节点下,插入3条记录:#0栏 = text,其它栏 = values()
 
tree1.insert(sf2, END, text='长沙市',values=('岳麓区','梅溪湖路复兴小区709号'))
tree1.insert(sf1, END, text='广州市',values=('白云区','下塘西路545号'))
# 以同样方法插入2条记录,它们会根据父节点找到自己的位置
 
tree1.pack(fill=BOTH,expand=True)
 
root.mainloop()

运行结果

 1.PNG

 

下图是我把上面的运行图基础上做出的解析图:

2.PNG

下面开始我的讲解:

Treeview组件做为一个整体,可以看成是树形组件和列表组件相合的一个组件。左边第1列就是树栏,第1列外,右边的列都是列表栏。

树栏这边,可以分层,分级,可以折叠。

 

由于第1列可以显示图标,所以也叫图标栏。

Treeview组件可以隐藏树栏,只显示列表栏,参数: show=’headings’

Treeview组件也可以只显示树栏,参数:show=’tree’

当然默认的是显示所有列,参数: show=’tree headings’

 

Treeview组件做为一个整体,每一行是一条记录,Treeview组件称一行为item,但每一行的“文本”在树栏和列表栏是不同的参数:在树栏,item的文本参数是:text,在列表栏的文本参数是:values,values这是一个列表或元组,以上图为例:

第1行,text=’广东’  values=()

第2行,text=’广州市’  values=('南山区','华侨城侨香路11号')

第3行,text=’深圳市’  values=('南城区','元美东路3号济亨网')

以此类推…….

 

Treeview组件也有自己的标题栏,组件最上面的“省城,区域,地址”就是标题栏上每一列的名称,这些名称不再区分,都是用参数text来表示(只有在每一行的记录中[item],才区别text,values)

“省城,区域,地址”是显示给用户看的,编程时,如何标识每一列呢?这有2种方法:

第1种是从0开始标识,最左边的1列为’#0’,再往右的列分别为’#1’, ‘#2’ ……

第2种是自定义的字符串来标识,如我的代码,以’qy’,’dz’ 来标识‘区域’‘地址’这2列(汉字的拼音简写)

 

为了让新手可以快的入门,我现在开始分开讲解,分别做一个树栏,列表栏,再合并讲解Treeview组件。

做一个纯树栏(只有图标栏)的Treeview组件

首先创建一个Treeview组件。

语法:Treeview ( 父组件,参数….. ) 

参数:

参数

说明

columns

值为一个列表,列表中元素为列表标识符

displaycolumns

值为列表,元素是列表标识符,表示显示的列表顺序

height

表示要显示的行数

padding

组件四周的填充要素(我前面的文章有讲解)

selectmode

选项: extended 选择多行(Ctrl+鼠标);browse 只能选择一行

none 不能改变选择;默认是选择多行

show

选项: tree 只显示树栏,headings 只显示除第一列的其它列

tree headings 表示显示所有列

 

我的代码里,创建Treeview组件

tree1 = Treeview(root, columns=('qy', 'dz'))

columns参数里只有2个列表标识符元素,但列表是有3个,因为第1个列表不用写入,它是固定存在的,不能取消,不能删除。(“#0”是第1列的标识符)

 

我现在要做一个单树栏的Treeview组件,所以,columns参数就不用写了,只要加一个参数 show=’Tree’  (不加这个参数也可以,但不加这个参数,组件的标题栏还会存在)

tree1 = Treeview(root,show='tree')


Treeview组件创建好了,现在就要开始创建节点,根节点已经存在了,它用一个空字符''来表示。

由于我们要在树栏里加入图标,所以我们先创建2个图像对象:

img1=PhotoImage(file='16-1.png')
img2=PhotoImage(file='16-2.png')

我一时没有找到合适的图片,只好找了2个大小16 X 16 不太相关的图片。

 

在树栏创建节点,是可以分层的,分级的,我先在根节点上创建2个子节点:sf1 和 sf2 (2个子节点显示为广东,湖南),创建节点,其实也是插入一行记录,只不过插入的文本,只有树栏的text参数,不会有列表栏的values参数,创建节点用insert()方法,语法是:

  insert (父组件,插入位置,text=’节点文本image=图像对象,open=/)

    注:open参数为True表示分层的各节点是展开的,为False则折叠各节点。

  插入位置跟以前学的Text组件一样的。

 

sf1 = tree1.insert('', END, text='广东',image=img1,open=True)
sf2 = tree1.insert('', END, text='湖南',image=img2,open=True)

 上面代码创建了sf1 和 sf2 这个节点,我们再在这2个节点下创建记(item),主要是改父组件,text参数:

tree1.insert(sf1, END, text='广州市')
tree1.insert(sf1, END, text='深圳市')
tree1.insert(sf1, END, text='东莞市')
# 在广州(sf1)节点下,插入3条子节点
 
tree1.insert(sf2, END, text='长沙市')
tree1.insert(sf2, END, text='湘潭市')
tree1.insert(sf2, END, text='衡阳市')
# 在湖南(sf2)节点下,插入3条子节点
 
tree1.insert(sf2, END, text='长沙市')
tree1.insert(sf1, END, text='广州市')
# 以同样方法插入2条记录,它们会根据父节点找到自己的位置

由于我不想再创建新的层级,所以,我只是插入记录(item),并没有返回一个变量,如果还想继续创建子节点,就返回变量,变量做为下一层的父组件名。如:

sf1-1=tree1.insert(sf1, END, text='广州市')
sf2-1=tree1.insert(sf2, END, text='长沙市')

 

文章来自wb98.com

好了,创建单树栏的代码如下:

from tkinter import *
from tkinter.ttk import *
 
root = Tk()
 
img1=PhotoImage(file='16-1.png')
img2=PhotoImage(file='16-2.png')
 
tree1 = Treeview(root,show='tree') 
 
sf1 = tree1.insert('', END, text='广东',image=img1,open=True)
sf2 = tree1.insert('', END, text='湖南',image=img2,open=True)
# 在根节点‘’下添加2个子节点:广东,湖南
 
tree1.insert(sf1, END, text='广州市')
tree1.insert(sf1, END, text='深圳市')
tree1.insert(sf1, END, text='东莞市')
# 在广州(sf1)节点下,插入3条子节点
 
tree1.insert(sf2, END, text='长沙市')
tree1.insert(sf2, END, text='湘潭市')
tree1.insert(sf2, END, text='衡阳市')
# 在湖南(sf2)节点下,插入3条子节点
 
tree1.insert(sf2, END, text='长沙市')
tree1.insert(sf1, END, text='广州市')
# 以同样方法插入2条记录,它们会根据父节点找到自己的位置
 
tree1.pack(fill=BOTH,expand=True)
 
root.mainloop()

运行结果:

3.PNG

 

我们去除 show=’tree’ 参数,去除open=’True’,再运行看看:

4.PNG

没有参数open=’True’,各节点的确是折叠起来了。没有参数show=’tree’,在节点广东的上面标题栏就出现了。

 

做一个单列表栏的Treeview组件。

首先,我们来创建Treeview组件:

tree1 = Treeview(root, columns=('qy', 'dz'),show='headings')

我创建的列表栏有2个列,我为这2个列起的列表标识符:‘qy’,‘dz’

在创建的参数里:

columns=('qy', 'dz') ,show=’headings’

注:上面参数说明有3个列:’#0’, 'qy', 'dz',但由于显示参数为:show=’headings’ 第1列就隐藏了。

 

列表栏有2列,它们有标题栏,我们用 heading() 方法来设置标题栏的文字:

语法:heading ( 列标识符,  text=标题文字 )

tree1.heading('qy', text='区域')
tree1.heading('dz', text='地址')


我们在上面说了,列标识符有2种,所以下面的代码是等价的

tree1.heading('#1', text='区域')
tree1.heading('#2', text='地址')


‘#0’是固定给第1列,即树列的,现在它只是隐藏了而已。  丶丌皛

 

接下来就是插入8条记录,用insert()方法来插入内容,insert()方法语法:

    insert (父组件,插入位置,values=列表元组,image=图像对象)

 

插入8条记录中的一行代码为:

tree1.insert('', END, values=('海珠区','阅江中路380号'))

由于第一列,即树栏并不需要内容,所以,text参数不需要,我们只需要输入参数:values,它的内容是元组,元素分别是2个列的内容。

 

下面是单列表栏的全部代码:

from tkinter import *
from tkinter.ttk import *
 
root = Tk() # 源码来自wb98.com
 
tree1 = Treeview(root, columns=('qy', 'dz'),show='headings') 
# 创建树表格组件,栏目有3个:#0, qy, dz 但是show='headings'会隐藏树栏
 
tree1.heading('qy', text='区域')
tree1.heading('dz', text='地址')
# 定义2个栏目的表头文字
 
tree1.insert('', END, values=('海珠区','阅江中路380号'))
tree1.insert('', END, values=('南山区','华侨城侨香路11号'))
tree1.insert('', END, values=('南城区','元美东路3号济亨网'))
 
tree1.insert('', END, values=('雨花区','韶山中路108号'))
tree1.insert('', END, values=('岳塘区','书院路42号云峰工作室'))
tree1.insert('', END, values=('蒸湘区','祝融路名都花园B9栋107室'))
 
tree1.insert('', END, values=('岳麓区','梅溪湖路复兴小区709号'))
tree1.insert('', END, values=('白云区','下塘西路545号'))
# 根节点('')下,插入8条记录:#0栏 = text,其它栏 = values()
 
tree1.pack(fill=BOTH,expand=True)
 
root.mainloop()

运行结果

5.PNG

上面的单列表栏也有标题栏,如不想见到它,我有一个方法:

参数: show=’tree’  这样标题栏就不见了。但第1列,即树栏会出现,我们用column() 方法设置第1列的宽度为0,而且,第1列宽度设置为不随窗体尺寸变化,这样,第1列就隐藏了。下面是代码:

tree1.column('#0',width=0,stretch=False)

 

cloumn()方法语法:

cloumn(列标识符,参数…….)

参数:

  width : 列的宽度

  anchor : 列内容的对齐方式

  stretch : 布尔值,为真,列的宽度随窗体的宽度变化而变化,为假,则不会。

 

全部代码:

from tkinter import *
from tkinter.ttk import *
 
root = Tk()  # 源码来自wb98.com
 
tree1 = Treeview(root, columns=('qy', 'dz'),show='tree') 
# 创建树表格组件,栏目有3个:#0, qy, dz 但是show='headings'会隐藏树栏
tree1.column('#0',width=0,stretch=False)
 
tree1.insert('', END, values=('海珠区','阅江中路380号'))
tree1.insert('', END, values=('南山区','华侨城侨香路11号'))
tree1.insert('', END, values=('南城区','元美东路3号济亨网'))
 
tree1.insert('', END, values=('雨花区','韶山中路108号'))
tree1.insert('', END, values=('岳塘区','书院路42号云峰工作室'))
tree1.insert('', END, values=('蒸湘区','祝融路名都花园B9栋107室'))
 
tree1.insert('', END, values=('岳麓区','梅溪湖路复兴小区709号'))
tree1.insert('', END, values=('白云区','下塘西路545号'))
# 根节点('')下,插入8条记录:#0栏 = text,其它栏 = values()
 
tree1.pack(fill=BOTH,expand=True)
 
root.mainloop()

运行结果:

6.PNG

 

做一个树栏和列表栏都显示的Treeview组件

  下面就结合上面的知识,把一个Treeview组件所有列都显示出来。

 

首先,我们来定义各个列的宽度,对齐方式(居中),stretch默认为True

tree1.column('#0', width=120, anchor=CENTER) 
tree1.column('qy', width=90, anchor=CENTER)
tree1.column('dz', width=180, anchor=CENTER)
# 定义3个栏目的宽度,对齐方法,宽度是否窗体变化

接着,我们来定义一下各个列的文字信息:

tree1.heading('#0', text='')
tree1.heading('qy', text='区域')
tree1.heading('dz', text='地址')

 

接下来,我们在根节点创建2个节点

sf1 = tree1.insert('', END, text='广东',image=img1,open=True)
sf2 = tree1.insert('', END, text='湖南',image=img2,open=True)


  接着,在sf1, sf2 2个子节点下,插入记录[item] ,插入一行记录内容时,要注意“父节点”要写对,插入的内容,textvalues2个参数都要写,(当然,textvalues也都可为空) values的元素如果少于列表数,则未赋值的列的数据为空,如果插入的数据多,多的数据则丢弃。

 

  插入的记录[item]代码,以及全部代码在文章最前面就已经提供了。在这里就不再提供一次了。

  关于Treeview组件结构以及分别创建纯树栏,纯列表栏,树栏和列表栏相合栏就讲到这里,下一篇文章我来讲讲Treeview组件的相关知识,如高,宽设置,图标的设置,记录的增加和修改和删除等。


  此文章来自:wb98.com  网站还有相关的系列课程文章,感兴趣的可以前往。

 


来源:济亨网

本文链接:http://wb98.com/post/341.html

    << 上一篇 下一篇 >>

    湘公网安备 43011102000514号 - 湘ICP备08100508号