Tkinter Treeview Selection选项发生与事件触发
在Treeview控件中可以有三种选择模式,分别是BROWSE(默认)、EXTENDED、NONE,这是使用selectmode参数设置的,当有新选择项目发生时会产生虚拟事件<<TreeviewSelect>>
,其实我们可以针对此特性设计相关功能。
示例1
使用默认的BROWSE选项,一次只能选择一个项目,当选择发生时将同步在窗口下方的状态栏显示所选择的项目。
from tkinter import *
from tkinter.ttk import *
def treeSelect(event):
widgetObj = event.widget # 取得控件
itemselected = widgetObj.selection()[0] # 取得选项
col1 = widgetObj.item(itemselected,"text") # 取得图标栏内容
# print("######## ",col1) # ######## 江苏
col2 = widgetObj.item(itemselected,"values")[0] # 取得第0索引栏位内容
# print(widgetObj.item(itemselected,"values")) # ('南京',)
str = "{0} : {1}".format(col1,col2) # 取得所选项目内容
var.set(str) # 设置状态栏内容
root = Tk()
root.title("apidemos.com")
stateCity = {"Illinois": "Chicago", "California": "Los Angeles",
"Texas": "Houston", "Washington": "Seattle",
"Jiangsu": "Nanjing", "Shandong": "Qingdao",
"Guangdong": "Guangzhou", "Fujian": "Xiamen"}
# 建立Treeview
tree = Treeview(root,columns=("cities"),selectmode=BROWSE)
# 建立栏标题
tree.heading("#0",text="State")
tree.heading("cities",text="City")
# 格式栏位
tree.column("cities",anchor=CENTER)
# 建立内容,行号从1算起偶数行是浅蓝色底
tree.tag_configure("evenColor",background="lightblue")
rowCount = 1
for state in stateCity.keys():
if (rowCount % 2 == 1):
tree.insert("",index=END,text=state,values=stateCity[state])
else:
tree.insert("",index=END,text=state,
values=stateCity[state],tags=("evenColor"))
rowCount += 1
tree.bind("<<TreeviewSelect>>",treeSelect)
tree.pack()
var = StringVar()
label = Label(root,textvariable=var,relief="groove")
label.pack(fill=BOTH,expand=True)
root.mainloop()
输出:
上述第23行在建立Treeview控件对象时,特别设置selectmode=BROWSE参数只是特别强调这个模式,因为这是默认模式,所以如果省略此设置也将获得一样的结果。程序第37行是将有选择项目发生时交由treeSelect( )事件处理程序处理。
第5行是取得窗口内发生此事件的控件,设置给widgetObj。第6行是Treeview控件对象widgetObj调用selection( )方法,目的是取得目前所选的项目,用itemselected代表,通常也可称此所选的项目是iid,这是tkinter内部使用的id。
第7、8行则是由控件对象widgetObj调用item( )方法,注意这里需要两个参数目的是取得所选项目的图标栏内容和索引栏内容。第9行是格式化所获得的内容,第10行则是将内容设置到状态栏。