五笔打字通主页
我今天来讲一个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()
运行结果
下图是我把上面的运行图基础上做出的解析图:
下面开始我的讲解:
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 ( 父组件,参数….. )
参数:
参数 | 说明 |
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()
运行结果:
我们去除 show=’tree’ 参数,去除open=’True’,再运行看看:
没有参数open=’True’,各节点的确是折叠起来了。没有参数show=’tree’,在节点广东的上面标题栏就出现了。
首先,我们来创建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()
运行结果
上面的单列表栏也有标题栏,如不想见到它,我有一个方法:
参数: 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()
运行结果:
下面就结合上面的知识,把一个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] ,插入一行记录内容时,要注意“父节点”要写对,插入的内容,text和values这2个参数都要写,(当然,text和values也都可为空) values的元素如果少于列表数,则未赋值的列的数据为空,如果插入的数据多,多的数据则丢弃。
插入的记录[item]代码,以及全部代码在文章最前面就已经提供了。在这里就不再提供一次了。
关于Treeview组件结构以及分别创建纯树栏,纯列表栏,树栏和列表栏相合栏就讲到这里,下一篇文章我来讲讲Treeview组件的相关知识,如高,宽设置,图标的设置,记录的增加和修改和删除等。
此文章来自:wb98.com 网站还有相关的系列课程文章,感兴趣的可以前往。
来源:济亨网
本文链接:https://wb98.com/post/341.html