當前位置:首頁 ? 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://www.chinaengraver.com/post/341.html

    << 上一篇 下一篇 >>

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

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