Tkinter Treeview的基本概念
Treeview是tkinter.ttk的控件,这个控件主要是提供多栏的显示功能,我们可以称其为树状表格数据(Treeview)。在设计时也可以在左边栏设计成树状结构或是称层次结构,用户可以显示或隐藏任何部分,这个最左边的栏称为图标栏。
设计Treeview控件的基本思想是,使用Treeview构造方法建立Treeview对象。
Treeview的语法如下。
Treeview(master, options, ...)
Treeview( )方法的第一个参数是父对象,表示这个Treeview将建立在哪一个父对象内。下列是Treeview( )方法内其他常用的options参数。
(1)columns
:栏位的字符串,其中,第一个栏位是图标栏是默认的,不在此设置范围,如果设置columns=("Name","Age"),则控件有三栏,首先是最左栏的图标栏,可以进行展开(expand)或是隐藏(collapse)操作,另外两栏是Name和Age。
(2)cursor
:可以设置光标在此控件上的外观。
(3)displaycolumns
:可以设置栏位显示顺序。
- 如果参数是“#all”表示显示所有栏,同时依建立顺序显示。
- 如果设置columns=("Name","Age","Date"),使用insert( )插入元素时需要依次插入元素。同样状况如果使用columns(2,0),(2,0)是指实体索引,则图标栏在最前面,紧跟着是Date栏,然后是Name栏。这种状况也可以写成columns=("Date","Name")
(4)height
:控件每行的高度。
(5)padding
:可以使用1~4个参数设置内容与控件框的间距,它的规则如下。
Value | Left | Top | Right | Bottom |
---|---|---|---|---|
a | a | a | a | a |
ab | a | b | a | b |
abc | a | c | b | c |
abcd | a | b | c | d |
(6)selectmode
:用户可以使用鼠标选择项目的方式。
- selectmode=BROWSE,一次选择一项,这是默认。
- selectmode=EXTENDED,一次可以选择多项。
- selectmode=NONE,无法用鼠标执行选择。
(7)show:默认是设置显示图标栏的标签show="tree",如果省略则是显示图标栏,如果设为show="headings",则不显示图标栏。
(8)takefocus:默认是True,如果不想被访问可以设为False。
下面以实例说明更多规则。
示例1
简单建立Treeview控件的应用。
from tkinter import *
from tkinter.ttk import *
root = Tk()
root.title("apidemos.com")
# 建立Treeview
tree = Treeview(root,columns="cities") # tree = Treeview(root,columns=("cities"))
# 建立栏标题
tree.heading("#0",text="State") # 图标栏
tree.heading("#1",text="City")
# 建立内容
tree.insert("",index=END,text="Eleanor",values="Chicago")
tree.insert("",index=END,text="California",values="Los Angeles")
tree.insert("",index=END,text="Tokyo",values="Houston")
tree.pack()
root.mainloop()
输出:
建议读者单击选择,以体会Treeview的基本操作,下方右图是单击选择的示范输出。
上述程序第9行建立Treeview控件,此控件名称是tree,此控件有一个栏位,域名是cities,未来程序设计可以使用此cities代表这一个栏位。经这样设置后,我们可以知道此多栏窗体有两个栏位,除了cities外,另外左边有图标栏位。
程序第11、12行使用heading( )方法,在这个方法内建立了栏标题,其中,第一个参数“#0”是指最左栏图标栏位,“#1”是指第一个栏位,所以这两行分别建立了两个栏标题。
程序第14~16行使用insert( )方法插入Treeview控件内容,在这个方法中的第一个参数“”,代表父id,因为图标栏未来可以有树状结构,所以有这一个栏位设计,后面会有实例说明。当所建的栏是最顶层时,可以用“”空字符串处理。第二个参数index=END代表将资料插入Treeview末端,它的思想与Text控件的END相同。第三个参数text是设置图标栏的内容。第4个参数的values是设置City栏的内容。
示例2
在建立Treeview控件时,增加show="headings"参数,将不显示图标栏。
from tkinter import *
from tkinter.ttk import *
root = Tk()
root.title("apidemos.com")
# 建立Treeview
tree = Treeview(root,columns=("cities"),show="headings")
# 建立栏标题
tree.heading("#0",text="State") # 图标栏
tree.heading("#1",text="City")
# 建立内容
tree.insert("",index=END,text="Eleanor",values="Chicago")
tree.insert("",index=END,text="California",values="LosAngeles")
tree.insert("",index=END,text="Tokyo",values="Houston")
tree.pack()
root.mainloop()
输出:
示例3
示例1第9行columns=("cities"),指出栏标题名称是cities,我们可以使用此字符串代表栏位。在第12行使用“#1”代表cities栏,其实可以使用此“cities”取代“#1”。
from tkinter import *
from tkinter.ttk import *
root = Tk()
root.title("apidemos.com")
# 建立Treeview
tree = Treeview(root,columns=("cities"))
# 建立栏标题
tree.heading("#0",text="State") # 图标栏
tree.heading("cities",text="City") # tree.heading("#1",text="City下施")
# 建立内容
tree.insert("",index=END,text="Eleanor",values="Chicago")
tree.insert("",index=END,text="California",values="LosAngeles")
tree.insert("",index=END,text="Tokyo",values="Houston")
tree.pack()
root.mainloop()
输出:
在程序1的第14行insert( )方法中第4个参数values是设置所插入的内容,上述由于除了图标栏外只有一个栏位,所以只是设置values等于字符串内容,如果有多栏时,须使用values=(value1, value2, … ),如果所设置的内容数太少时其他栏将是空白,如果所设置的内容数太多时多出来的内容将被抛弃。
示例4
增加population人口数栏位,其中,人口数的单位是万人。
from tkinter import *
from tkinter.ttk import *
root = Tk()
root.title("apidemos.com")
# 建立Treeview
tree = Treeview(root,columns=("cities","populations"))
# 建立栏标题
tree.heading("#0",text="State") # 图标栏
tree.heading("#1",text="City")
tree.heading("#2",text="Populations")
# 建立内容
tree.insert("",index=END,text="Eleanor",values=("Chicago","800"))
# tree.insert("",index=END,text="Eleanor",values=("Chicago","800","9999"))# 多余信息
tree.insert("",index=END,text="California",values=("LosAngeles","1000"))#
# tree.insert("",index=END,text="California",values=("LosAngeles"))# 缺少信息
tree.insert("",index=END,text="Tokyo",values=("Houston","900"))# 信息正常
tree.pack()
root.mainloop()
输出:
由上述执行结果下面再次强调insert()方法的用法。
(1)text
:设置图标栏的内容。
(2)values
:设置一般栏位的内容,values=("芝加哥","800"),这是以顺序方式设置栏位,“芝加哥”是第一个栏位,“800”是第二个栏位。
其实当我们了解上述values参数内容后,也可以将Python的列表应用于建立栏位内容。
示例5
使用列表方式建立栏位内容,读者应该学习第8~10行设置列表内容,以及第18~20行将列表应用在insert( )方法的values参数。
from tkinter import *
from tkinter.ttk import *
root = Tk()
root.title("apidemos.com")
tuple1 = ("Chicago","800") # 以元组方式设置栏内容
list2 = ["LosAngeles","1000"] # 以列表方式设置栏内容
list3 = ["Houston","900"] # 以列表方式设置栏内容
# 建立Treeview
tree = Treeview(root,columns=("cities","populations"))
# 建立栏标题
tree.heading("#0",text="State") # 图标栏
tree.heading("#1",text="City")
tree.heading("#2",text="Populations")
# 建立内容
tree.insert("",index=END,text="Eleanor",values=tuple1) # 也可以使用元组代替
tree.insert("",index=END,text="California",values=list2)
tree.insert("",index=END,text="Tokyo",values=list2)
tree.pack()
root.mainloop()
输出:
上述程序使用列表建立insert( )方法的values参数内容,也可以使用元组代替,具有相同效果。