當前位置:首頁 ? tkinter ? 正文

Tkinter的Treeview組件增加,刪除,修改,設置等操作

在第1列圖標欄為一行記錄設一個圖標

我們一般是在節點上提供圖標,但你要知道,每一行記錄都可以在第一列顯示圖標,只要在插入代碼加上參數: image=圖像對象

如代碼

tree1.insert(sf1, END, text='廣州市',values=('海珠區','閱江中路380號'))

加參數image=img1,為

tree1.insert(sf1, END, text='廣州市',values=('海珠區','閱江中路380號') ,image=img1)

運行結果: 

7.PNG

 可以看到在“廣東”節點下的“廣州市”也可以出現圖標。

 為一列的標題欄設一個圖標

其實,在標題欄也可以顯示圖標的。只要定義標題文本的同時,再定義一個image參數,如:

tree1.heading('qy', text='區域',image=img1)

運行結果:

8.PNG

可以看到,標題欄也出現了圖標,只是這個圖標在標題欄文本的右邊,而第1列出現的圖標是文本的左邊。

獲取一行的文本,獲取一行中某一項的文本:

在此之前,我們先來總結一下上面講的insert()方法。

你是否跟我一樣,也在用vscode在編寫tkinter程序?如果是,你按住ctrl鍵,再用點鼠標點擊代碼中的insert ,會彈出ttk.py 新頁面,頁面里你會看到insert的構建方法:

    insert(parent, index, iid=None, **kw)

解釋:

parent : 對于有樹欄的Treeview,parent是父節點,對于只是列表欄的Treeview,parent一般為空。

index :插入位置??梢允荅ND或’end’ ,也可以是數字的,如果你想新插入的item(記錄)成為第某節點的第一個,index就設為0,以此類推。

iid : 每一行記錄(item)的標識符,這個參數,我上面沒有講解,等下,我會專門講解。

**kw :設置插入的記錄(item)所支持屬性,我前面基本都講解了,只有tags 這個標簽參數沒有講解,下面我也會專門講解。丶丌皛

回顧一下,插入item所支持的屬性:

參數

說明

text

樹欄,第1列顯示的文本

values

第2列以后顯示的文本,元組元素為各列顯示的文本

image

每行顯示在第1列的圖標

open

在樹欄中,節點是否展開,True展開,False折疊

tags

為插入的item設置tags標簽

   

我現在先來講一個每一行item的標識符iid,我在前面的insert語句中都沒有用過這個iid參數,在這種情況,系統是會自動為我們設定一個不重復的值。

我們在上面代碼里,在創建sf1,sf2這2個節點的代碼的下面,加入2行代碼:

sf1 = tree1.insert('', END, text='廣東',image=img1,open=True)
sf2 = tree1.insert('', END, text='湖南',image=img2,open=True)
# 在根節點‘’下添加2個子節點:廣東,湖南
print(sf1) # 輸出節點sf1的iid值
print(sf2) # 輸出節點sf2的iid值

運行后,會輸出:

I001

I002

這2個以i的大寫開頭的的字符正是這2個節點這一行(item)的標識符。

 

I001,I002 是系統自動為我們設定的一個iid值,如果我們要自定義iid值,在insert() 方法加上iid參數即可,如:

sf1 = tree1.insert('', END, text='廣東',iid='aaa',image=img1,open=True)
sf2 = tree1.insert('', END, text='湖南',iid='bbb',image=img2,open=True)
# 在根節點‘’下添加2個子節點:廣東,湖南
print(sf1) # 輸出節點sf1的iid值
print(sf2) # 輸出節點sf2的iid值

運行后,會輸出:

aaa

bbb

 

那么,我們如何得到每一行item的標識符iid呢?這里有一個方法:selection()  這個方法的返回值就是你選中那一行的iid值。

那么,如何得到每一行item的text,values等各參數值呢?這里有一個方法可以幫你:

item( iid )  當參數iid可以確定,返回值就是item的各參數值,是鍵值對的字典。

如果要知道某個具體的參數的值,可以再加一個 option 參數,如:

item(iid, option=’text’) #  輸出text的值

item(iid, option=’values’) # 輸出values的值

 

下面我們就用代碼來演示一下,但演示前,還是要再學一點知識,先了解一個Treeview組件的3個虛擬事件:

1.  <<TreeviewSelect>>  選擇行發生了變化觸發事件

2.  <<TreeviewOpen>>   節點展開時觸發事件

3.  <<TreeviewClose>>  節點折疊時觸發事件

 

現在,我來演示一下這3個虛擬事件以及得到每行的iid標識符及各參數值,我在上面的代碼基礎上,在最后再插入虛擬事件代碼和綁定函數代碼。

全部代碼如下:

from tkinter import *
from tkinter.ttk import *
 
root = Tk()
 
img1=PhotoImage(file='16-1.png')
img2=PhotoImage(file='16-2.png')
 
tree1 = Treeview(root, columns=('qy', 'dz')) 
# 創建樹表格組件,欄目有3個:#0, qy, dz
 
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='地址')
# 定義3個欄目的表頭文字
 
sf1 = tree1.insert('', END, text='廣東',image=img1,open=True)
sf2 = tree1.insert('', END, text='湖南',image=img2,open=True)
# 在根節點‘’下添加2個子節點:廣東,湖南
print(sf1)
 
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)
 
# 以下為新加代碼
def selectjob(event):
    print('----------')
    print('iid=',tree1.selection()) # 輸入選中的行的iid值
    print(tree1.item(tree1.selection())) # 輸出選中行的各參數值的鍵值對字典
    print('text=',tree1.item(tree1.selection(),option='text')) # 輸出某個參數的值
 
def openjob(event):
    print('============')
    print(tree1.selection(),'節點展開') # 某iid值的節點被展開
def closejob(event):
    print('============')
    print(tree1.selection(),'節點折疊') # 某iid值的節點被折疊
 
tree1.bind("<<TreeviewSelect>>",selectjob) # 某行被選中事件
tree1.bind("<<TreeviewOpen>>",openjob) # 某節點被展開
tree1.bind("<<TreeviewClose>>",closejob) # 某節點被折疊
 
root.mainloop()

大家自行運行測試一下。丶丌皛

修改一行的文本,修改一行中某一項的文本

前面講解了如何獲取某一行的iid值,某一行的所有參數值,某一行某個參數的值。

下面我來講一來如何改變一行中某個參數的值,或者一行文本都改變。

在insert()方法中,我們可以設置各參數值,在事后也可以通過以下方法來改變。

 

1.  item()方法

    語法:item(iid, text=文本, values=元組, image=圖像對象)

 

2. set()方法

    語法:set(iid,column=列標識符, value=文本)

    注:這種方法不能設置第1列(#0)的文本信息

 

以下代碼,我在上面代碼基礎上修改替換最后的代碼,有些地方提供了2種方法來修改相關信息。

from tkinter import *
from tkinter.ttk import *
 
root = Tk() # 源碼來自wb98.com
 
img1=PhotoImage(file='16-1.png')
img2=PhotoImage(file='16-2.png')
 
tree1 = Treeview(root, columns=('qy', 'dz')) 
# 創建樹表格組件,欄目有3個:#0, qy, dz
 
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='地址')
# 定義3個欄目的表頭文字
 
sf1 = tree1.insert('', END, text='廣東',image=img1,open=True)
sf2 = tree1.insert('', END, text='湖南',image=img2,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)
 
# 以下為新加代碼
def edit1(): # 更改節點
    tree1.item('I001',text='廣東①')
    tree1.item('I002',text='湖南①')
def edit2(): # 更改一行
    tree1.item('I003',text='廣州市②',values=('海珠區②','閱江中路380號②'))
def edit3(): # 更改第1列文本,省城
    tree1.item('I004',text='深圳市③')
def edit4(): # 更改第2列,區域
    tree1.item('I005',values=('南城區④','元美東路3號濟亨網'))
    # 或者用下句
    # tree1.set('I005',column='qy',value='南城區④')
def edit5(): # 更改第3列,地址
    tree1.item('I00A',values=('白云區','下塘西路545號⑤'))
    # 或者用下句
    # tree1.set('I00A',column='dz',value='塘西路545號⑤')
 
 
fr1=Frame(root,relief='ridge',borderwidth=1) # 不設置邊線寬,無法顯示
fr1.pack()
 
but1=Button(fr1,text="更改節點①",command=edit1)
but1.pack(side=LEFT)
but2=Button(fr1,text="更改一行②",command=edit2)
but2.pack(side=LEFT)
but3=Button(fr1,text="更改省城③",command=edit3)
but3.pack(side=LEFT)
but4=Button(fr1,text="更改地區④",command=edit4)
but4.pack(side=LEFT)
but5=Button(fr1,text="更改地址⑤",command=edit5)
but5.pack(side=LEFT)
 
root.mainloop()

運行結果

9.PNG

 

修改標題欄

Treeview組件也可以改標題欄,你在合適的地方用heading()方法是可以改。代碼如下:

tree1.heading('#0',text='改分類')
tree1.heading('#1',text='改區域')
tree1.heading('#2',text='改地址')


修改列寬,行高

在創建Treeview組件,就可以通過column()方法設置列寬,運行后,也可以在適當的位置用同樣的方法重新設置列寬,如:

tree1.column('#01',width=150)


行高,也可以在創建Treeview組件后,用Style()來設置,也可以在運行適當位置來重新設置,代碼如下:

Style().configure('Treeview',rowheight=50)


設置修改字體:

我們可以在創建Treeview組件后,用Style()樣式來設置,組件的標題頭和每一行的字體是分開設置的。代碼如下:

style = Style()
style.configure("Treeview.Heading", font=('黑體', 20)) # 設置標題頭的字體
style.configure("Treeview", font=(None, 20)) # 設置每一行的字體


有時,我們需要為某一行專門來設置顏色或字體等,以上的知識就沒有辦法做到,這時,就要借tags標簽來幫忙做到。這個tags標簽知識,我們在以前的組件,如Text組件學到,正是借tags標簽,我們可以為一行文字中的某幾個文字設一個標簽,然后為這個標簽來設置字體,顏色。Treeview組件的tags原理也是一樣的。

 

Treeview組件的tags知識:

其實,我們在用insert()方法插入一行文本時,就可以用tags這個參數,只是我沒有使用,下面的代碼,我在前面的代碼基礎上進入改進,但我把sfr1,sfr2這2個節點去除,所有數據都在根節點基礎上插入。

下面要講解的知識,涉及到的知識有:

插入一行文本,在插入過程中設置tags :

insert(父節點,插入位置,text=某值,values=某元組,tags=某字符串)

 

為iid的某行重新設置tags:

  item( iid,tags=某字符串)    #  iid為某行的標識符

為某個tags設置具體內容:字體,顏色等。

  tag_configure( tags=某字符串, font=某值,background=某值…….)

 

注意:根據網友反饋以及我本人的測試,python版本在3.6時,tag_configure()方法在顏色的設定起作用,3.7版,有時起作用,有時不起作用,但3.8版本,tag_configure()設置顏色是肯定不起作用了,不知道是不是新版本3.8的改進,還是它的BUG,但是加入一些style()方法的代碼,才是可以起作用,這個以后再說…..

 

下面的代碼,我利用tags來改變選中一行的字體大小。原理:利用虛擬事件<<TreeviewSelect>>,獲取當前行的iid標識符,再用get_children()得到根目錄下所有行的iid標識符,利用循環把所有行都重新設置tags為NONO,循環后再單獨為當前行tags設置OKOK,再用tag_configure()為OKOK標簽設置另外一種字體及大小。代碼如下:

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) 
tree1.column('qy', width=90, anchor=CENTER)
tree1.column('dz', width=160, anchor=W)
# 定義3個欄目的寬度,對齊方法,寬度是否窗體變化
 
tree1.heading('#0', text='城市')
tree1.heading('qy', text='區域')
tree1.heading('dz', text='地址')
# 定義3個欄目的表頭文字
 
tree1.insert('', END, text='廣州市',values=('海珠區','閱江中路380號'))
tree1.insert('', END, text='深圳市',values=('南山區','華僑城僑香路11號'))
tree1.insert('', END, text='東莞市',values=('南城區','元美東路3號濟亨網'))
 
tree1.insert('', END, text='長沙市',values=('雨花區','韶山中路108號'))
tree1.insert('', END, text='湘潭市',values=('岳塘區','書院路42號云峰工作室'))
tree1.insert('', END, text='衡陽市',values=('蒸湘區','祝融路名都花園B9棟107室'))
 
tree1.insert('', END, text='長沙市',values=('岳麓區','梅溪湖路復興小區709號'))
tree1.insert('', END, text='廣州市',values=('白云區','下塘西路545號'))
 
tree1.pack(fill=BOTH,expand=True)
 
def selectjob(event):
    A=tree1.selection() # 獲取當前選中行的iid
    items = tree1.get_children()  # 獲取根節點下所有行的iid,元組
    print(items) # 大家可以看看這個iid元組是什么東西
    for i in items: # 用循環把所有行再重新設置新的tags
        tree1.item(i,tags='NONO')  # 重新設置tags
 
    tree1.item(A,tags='OKOK') # 然后,再單獨為當前選中行設置一個tags:OKOK
    tree1.tag_configure('OKOK',font='黑體 12')  # 為tags(okok)設置另一字體及大小
    
tree1.update()  # 源碼來自wb98.com
 
tree1.bind("<<TreeviewSelect>>",selectjob)
 
root.mainloop()

運行結果

10.PNG

選中行為黑體,字體大小也比默認的要大一點,是不是醒目一些?

隔行顯示不同的顏色

  下面我來做一個隔行顯示不同顏色的代碼,這個牽涉到背景顏色,我前面說,在3.8版的tkinter,要加多一些代碼,才能讓背景顏色起作用。

這段要多加的代碼就是:

def fixed_map(option):
    return[elm for elm in style.map('Treeview',query_opt=option)
    if elm[:2]!=('!disabled','!selected')]
 
style=Style()
style.map('Treeview',foreground=fixed_map('foreground'),
     background=fixed_map('background'),)


以下是全部代碼:

from tkinter import *
from tkinter.ttk import *
 
def tree_color(): # 表格欄隔行顯示不同顏色函數
    items=tree1.get_children() # 得到根目錄所有行的iid
    i=0 # 初值
    for hiid in items:
        if i/2!=int(i/2): # 判斷奇偶
            tag1='' # 奇數行
        else:
            tag1='even' # 偶數行
        tree1.item(hiid,tag=tag1) # 偶數行設為淺藍色的tag='even'
        i+=1 # 累加1
 
root = Tk() # 源碼來自wb98.com
 
img1=PhotoImage(file='16-1.png')
img2=PhotoImage(file='16-2.png')
 
tree1 = Treeview(root, columns=('qy', 'dz')) 
# 創建樹表格組件,欄目有3個:#0, qy, dz
 
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='地址')
# 定義3個欄目的表頭文字
 
tree1.insert('', END, text='廣州市',values=('海珠區','閱江中路380號'))
tree1.insert('', END, text='深圳市',values=('南山區','華僑城僑香路11號'))
tree1.insert('', END, text='東莞市',values=('南城區','元美東路3號濟亨網'))
 
tree1.insert('', END, text='長沙市',values=('雨花區','韶山中路108號'))
tree1.insert('', END, text='湘潭市',values=('岳塘區','書院路42號云峰工作室'))
tree1.insert('', END, text='衡陽市',values=('蒸湘區','祝融路名都花園B9棟107室'))
 
tree1.insert('', END, text='長沙市',values=('岳麓區','梅溪湖路復興小區709號'))
tree1.insert('', END, text='廣州市',values=('白云區','下塘西路545號'))
 
tree1.pack(fill=BOTH,expand=True)
 
# 3.8版要多加的代碼------------
def fixed_map(option):
    return [elm for elm in style.map("Treeview", query_opt=option)
     if elm[:2] != ("!disabled", "!selected")]
 
style = Style()
style.map("Treeview", foreground=fixed_map("foreground"), 
background=fixed_map("background"))
# 3.8版要多加的代碼------------
 
#定義背景色風格
tree1.tag_configure('even', background='lightblue') # even標簽設定為淺藍色背景顏色
 
tree_color() # 啟動程序,根據奇偶行設為不同的背景顏色
 
root.mainloop()

運行結果:

11.PNG

 一行記錄的隱藏,重現,刪除

在上面的基礎上,再學一點知識,隱藏一行,重新顯示隱藏的行,徹底刪除一行。

delete(iid)  # 徹底刪除一行,不能恢復

detach(iid)  # 假刪除,只是隱藏

move(iid, parent,index) # 根據保存的iid, parent,index重新顯示假刪除的行

 

如何記下要刪除的選中項的iid,parent,index ?

分別用selection(),parent(),index() 方法,相關語法,介紹:

 

parent(item):

樹形的Treeview,返回父節點iid;表格形的Treeview,則返回空字符串。

index(item)

返回數字的item索引,索引從0開始算

selection(items=None)

返回當前選定的節點的iid

 

以下是全部代碼:

from tkinter import *
from tkinter.ttk import *
 
def tree_color(): # 表格欄隔行顯示不同顏色函數
    items=tree1.get_children() # 得到根目錄所有行的iid
    i=0 # 初值
    for hiid in items:
        if i/2!=int(i/2): # 判斷奇偶
            tag1='' # 奇數行
        else:
            tag1='even' # 偶數行
        tree1.item(hiid,tag=tag1) # 偶數行設為淺藍色的tag='even'
        i+=1 # 累加1
 
root = Tk()
 
img1=PhotoImage(file='16-1.png')
img2=PhotoImage(file='16-2.png')
 
tree1 = Treeview(root, columns=('qy', 'dz')) 
# 創建樹表格組件,欄目有3個:#0, qy, dz
 
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='地址')
# 定義3個欄目的表頭文字
 
tree1.insert('', END, text='廣州市',values=('海珠區','閱江中路380號'))
tree1.insert('', END, text='深圳市',values=('南山區','華僑城僑香路11號'))
tree1.insert('', END, text='東莞市',values=('南城區','元美東路3號濟亨網'))
 
tree1.insert('', END, text='長沙市',values=('雨花區','韶山中路108號'))
tree1.insert('', END, text='湘潭市',values=('岳塘區','書院路42號云峰工作室'))
tree1.insert('', END, text='衡陽市',values=('蒸湘區','祝融路名都花園B9棟107室'))
 
tree1.insert('', END, text='長沙市',values=('岳麓區','梅溪湖路復興小區709號'))
tree1.insert('', END, text='廣州市',values=('白云區','下塘西路545號'))
 
tree1.pack(fill=BOTH,expand=True)
 
# 3.8版要多加的代碼------------
# 源碼來自wb98.com
def fixed_map(option):
    return [elm for elm in style.map("Treeview", query_opt=option)
     if elm[:2] != ("!disabled", "!selected")]
 
style = Style()
style.map("Treeview", foreground=fixed_map("foreground"), 
background=fixed_map("background"))
# 3.8版要多加的代碼------------
 
#定義背景色風格
tree1.tag_configure('even', background='lightblue') # even標簽設定為淺藍色背景顏色
 
tree_color() # 啟動程序,根據奇偶行設為不行的背景顏色
 
tree1.selection_set('I001') # 默認選中第一項
 
fr1=Frame(root) # 收入3個按鈕
fr1.pack(pady=10)
 
def deljob(): # 真刪除
    iid=tree1.selection()
    tree1.delete(iid)
    tree_color() # 啟動程序,根據奇偶行設為不行的背景顏色
def hidejob(): # 假刪除,只是隱藏
    global iid1,index1,parent1 # 定義為全局變量
    iid1=tree1.selection() # 假刪除前,記下選中前的iid
    index1=tree1.index(iid1) # 記下假刪除行的位置index
    parent1=tree1.parent(iid1) # 記下假刪除行的父節點
    tree1.detach(iid1) # 假刪除,隱藏
    tree_color() # 刪除及恢復記錄后,根據奇偶行重新設置不同行的背景顏色
 
def showjob(): # 把假刪除的記錄在原來的位置顯示
    global iid1,index1,parent1 # 定義為全局變量
    tree1.selection_set() # 取消以前的可能選中項
    tree1.move(iid1,parent1,index1) # 在原來的位置恢復假刪除的記錄
    tree_color() # 刪除及恢復記錄后,根據奇偶行重新設置不同行的背景顏色
 
but1=Button(fr1,text="隱藏",command=hidejob)
but1.pack(side=LEFT)
but1=Button(fr1,text="重現",command=showjob)
but1.pack(side=LEFT)
but1=Button(fr1,text="徹底刪除",command=deljob)
but1.pack(side=LEFT,padx=(20,0))
 
root.mainloop()

運行結果

12.PNG

heading() 方法為標題頭設置不同的回調函數

上面的代碼,運行后,點擊標題頭都會有輸出,因為我用heading()為不同的列綁定了不同的回調函數,相關代碼是:

tree1.heading('#0', text='城市',command=lambda:print('城市欄'))
tree1.heading('qy', text='區域',command=lambda:print('區域欄'))
tree1.heading('dz', text='地址',command=lambda:print('地址欄'))

  

語法:heading(列標識符, text=某值, command=回調函數)

上面的代碼,只是簡單的輸出一個信息,其實我們可以點擊列標題來做點別的什么事,例如,第一列來排序顯示,當然這又需要加排序的代碼,以后有時間再講排序的事。

 

為不同的tag綁定不同的事件和函數

   跟Text組件一樣,我們可以為不同的tag標簽綁定不同的事件和回調函數,方法也是類似的,語法:

tag_bind( tag, 事件,回調函數)

上面的代碼已經我已經加入了相關代碼:

tree1.tag_bind('1hang','<Button-1>',lambda even:print('奇數行')) # 1hang標簽行綁定鼠標單擊事件
tree1.tag_bind('2hang','<Button-1>',lambda even:print('偶數行')) # 2hang標簽行綁定鼠標單擊事件


你點擊奇偶行會得到不同的輸出,因為奇偶行有不同的tag


以上我講解的代碼,其實單行操作的,如果你按ctrl+鼠標單擊選擇多行,肯定會出錯,你用可以在創建Treeview組件時,增加參數 selectmode=’browse’ ,確定為選擇單行模式,也可以選擇默認的多行模式,在實際操作中,要用循環的方法把選中的行,再一個個操作一次。這里我就暫時不再講解,以后有機會再講解。

Treeview組件加上水平和垂直滾動條

最后講解一下為Treeview組件加上水平和垂直滾動條。其實不算什么新知識,只要運用以前學的知識就行了。

首先為在代碼的最前面為窗體限定在一個范圍內,并創建定位滾動條,然后在代碼的最后為Treeview組件綁定水平和垂直滾動條。

全部代碼如下:

from tkinter import *
from tkinter.ttk import *
 
root = Tk() # 源碼來自wb98.com
root.geometry('300x200+888+444')
 
scr1=Scrollbar(root)  # 垂直滾動條
scr1.pack(fill=Y,side=RIGHT)
scr2=Scrollbar(orient=HORIZONTAL) # 水平滾動條
scr2.pack(fill=X,side=BOTTOM)
 
img1=PhotoImage(file='16-1.png')
img2=PhotoImage(file='16-2.png')
 
tree1 = Treeview(root, columns=('qy', 'dz')) 
# 創建樹表格組件,欄目有3個:#0, qy, dz
 
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='地址')
# 定義3個欄目的表頭文字
 
sf1 = tree1.insert('', END, text='廣東',image=img1,open=True)
sf2 = tree1.insert('', END, text='湖南',image=img2,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)
 
# 以下綁定水平和垂直滾動條
tree1.config(xscrollcommand = scr2.set)
scr2.config(command =tree1.xview)
 
tree1.config(yscrollcommand = scr1.set)
scr1.config(command = tree1.yview)
 
root.mainloop()

運行結果

       13.PNG

 

Treeview 組件要學的知識太多了,Treeview組件知識我暫時講到這,還有些知識,我以后有機會再講。

此文章來自:wb98.com  網站還有相關的系列課程文章,感興趣的可以前往。

下一篇文章,我來講一下python內置的SQLite3數據庫。

來源:濟亨網

本文鏈接:http://www.chinaengraver.com/post/342.html

    << 上一篇 下一篇 >>

    湘公網安備 43011102000514號 - 湘ICP備08100508號

    2019年秋霞鲁丝片瓜皮_导航亚洲AV日韩AV永久无码_有没有哪些可以看片的免费的_国产色妞妞在线视频免费播放