樹狀表格數據(Treeview)。在設計時也可以在左邊欄設計成樹狀結構或是稱層次結構,用戶
可以顯示或隱藏任何部分,這個最左邊的欄稱為圖標欄。
設計Treeview控件的基本思想是,使用Treeview構造方法建立Treeview對象。
它的語法如下。
Treeview(父對象,options,···)
Treeview()方法的第壹個參數是父對象,表示這個Treeview將建立在哪壹個父對象內。
下列是Treeview()方法內其他常用的options參數。
(1)columns:欄位的字符串,其中,第壹個欄位是圖標欄默認的,不在此設置範圍內,
如果設置columns=("Name","Age"),則控件有三欄,首先是最左欄的圖標欄,可以進行展開
(expand)或是隱藏(collapse)操作,另外兩欄是Name和Age。
(2)cursor:可以設置光標在此控件上的外觀。
(3)displaycolumns:可以設置欄位顯示順序。
1.如果參數是"#all"表示顯示所有欄,同時依建立順序顯示。
2.如果設置columns=("Name","Age","Date"),使用insert()插入元素時需要依次插入元素。
同樣狀況如果使用columns(2,0),(2,0)是指實體索引,則圖標欄在最前面,緊跟著是Date欄,
然後是Name欄。這種狀況也可以寫成columns("Date","Name")
(4)height:控件每行的高度。
(5)padding:可以使用1~4個參數設置內容與控件框的間距。
(6)selectmode:用戶可以使用鼠標選擇項目的方式。
1.selectmode=BROWSE,壹次選擇壹項,這是默認。
2.selectmode=EXTENDED,壹次可以選擇多項。
3.selectmode=NONE,無法用鼠標執行選擇。
(7)show:默認是設置顯示圖標欄的標簽show="tree",如果省略則是顯示圖標欄,如果設為
show="headings",則不顯示圖標欄。
(8)takefocus:默認是True,如果不想被訪問可以設為False。
實例:簡單建立Treeview控件的應用。
運行結果:
講解:tree=Treeview(root,columns=("cities"))建立Treeview控件,此控件
有壹個欄位,域名是cities。
tree.heading("#0",text="State")和tree.heading("#1",text="City")使用heading()方法,
在這個方法內建立了欄標題,其中,第壹個參數"#0"是指最左欄圖標欄位,"#1"是指第壹個
欄位,所以這兩行分別建立了兩個欄標題。
tree.insert("",index=END,text="伊利諾",value="芝加哥")使用inert()方法插入Treeview控件
內容,在這個方法中的第壹個參數"",代表父id,因為圖標欄未來可以有樹狀結構,所以有這
壹個欄位設計。當所建的欄是是最頂層時,可以用""空字符串處理。第二個參數index=END代表
將資料插入Treeview末端,它的思想與Text控件的END相同。第三個參數text是設置圖標欄的
內容。第4個參數的values是設置City的內容。
樣例2:在建立Treeview控件時,增加show="heading"參數,將不顯示圖標欄。
運行結果:
insert()方法第4個參數values是設置所插入的內容。如果有多欄時,須使用
values=(value1,value2,···),如果所設置的內容數太少時其他欄僵屍空白,如果所設置
的內容數太多時多出來的內容將被拋棄。
樣例3:增加population人口數欄位,其中,人口數的單位是萬人。
運行結果:
也可以將Python的列表應用於建立欄位內容。
Treeview控件的column()方法主要用於格式化特定欄位的內容,它的語法格式如下。
column(id,options)
其中,id是指出特定欄位,可以用字符串表達,或是用"#index"索引方式。下列是options
的可能參數。
(1)anchor:可以設置欄內容參考位置。
(2)minwidth:最小欄寬,默認是20像素。
(3)stretch:默認是1,當控件大小改變時欄寬將隨著改變。
(4)width:默認欄寬是200像素。
如果使用此方法不含參數,如下所示:
ret=column(id)
將以字典方式傳回特定欄所有參數的內容。
樣例:格式化,將第1、2欄寬度改為150,同時居中對齊,圖標欄則不改變。
建立Treeview控件內容時,常常會需要在不同行之間用不同底色作區分,以方便使用者查看,
若是想設計這方面的程序,可以使用Tet控件的標簽。Treeview控件有tag_configure()方法,
可以使用這個方法建立標簽,然後定義此標簽的格式,可參考下列指令。
tag_configure("tagName",options,···)
上述第壹個參數tagName是標簽名稱,可以用此名稱將此標簽導入欄位數據。
options的可能參數如下。
(1)background:標簽背景顏色。
(2)font:字形設置。
(3)foreground:標簽前景顏色。
(4)image:圖像與列表同時顯示。
要將標簽導入欄位使用的是insert()方法,這時需在此方法內增加tags參數設置,如下所示。
insert(···,tags="tagName")
樣例:將偶數行使用藍色底顯示。
層級式(Hierarchy),只要在圖標欄先建立top-level的項目id,然後將相關子項目放在所屬的
top-level項目d即可。
樣例:建立層級式的Treeview控件內容。
在insert()方法內若是增加image參數可以添加圖像,在添加圖像時需要考慮的是可能row的
高度不足,所以必須增加高度。這時可以用下列Style()方法處理。
Style().conigure("TreeView","rowheight=xx") #xx是高度設置
樣例:設計壹個含有圖像的Treeview。
Treeview控件中可以有三種選擇模式,分別是BROWSE(默認)、EXTENDED、NONE,這是
使用selectmode參數設置的,當有新選擇項目發生時會產生虛擬事件<<TreeviewSelect>>,
其實我們可以針對此特性設計相關功能。
樣例:
在Treeview控件中可以使用delete()方法刪除所選的項目,實例:
樣例:刪除所選的項目,這個程序在建立Treeview控件時設置selectmode=EXTENDED,相當於壹次
可以選擇多項,第二個選項在單擊鼠標時可以同時按Ctrl鍵,可以選擇不連續的選項。如果
第二個選項在單擊鼠標時同時按Shift鍵,可以選擇連續的選項。這個程序下方有Remove按鈕,
單擊此按鈕可以刪除所選項目。
在使用Treeview控件時,另壹個常用功能是插入項目。插入的方式與建立控件的插入方法insert()
是壹樣的。至於所插入的內容則可以使用tkinter的Entry控件。
樣例:增加設計插入功能,由於這個Treeview控件包含圖標欄下***有兩個欄位,所以若是想要
插入必須建立兩個Entry控件。由於我們必須標出所插入的控件,所以必須在Entry旁加上兩個
標簽。另外,在執行插入時必須使用壹個按鈕表示出執行插入操作,所以必須另外創建壹個按鈕。
講解:rowconfigure()方法的第壹個參數是1,代表row=1,相當於讓row=1的Treeview
控件隨著窗口縮放,縮放比由第二個參數weight=1得知是1:1縮放。columnconfigure()方法
的第壹個參數是1,代表column=1,相當於讓column=1的stateEntry控件隨著窗口縮放,縮放
比由第二個參數weight=1得知是1:1縮放。columnconfigure()方法內的第壹個參數是3,代表
column=3,相當於讓column=3的cityEntry控件隨著窗口縮放,縮放比由第二個參數weight=1
得知是1:1縮放。如果沒有上述設置,當縮放窗口時,所有組件大小將不會更改。
在使用Treeview控件時,常常需要執行雙擊操作,最常見的是打開文檔。在Treeview控件中
當發生雙擊時,會產生<Double-1>事件,我們可以利用這個功能建立壹個雙擊的事件處理程序。
樣例:當雙擊Treeview控件中的某個項目時,會出現對話框,列出所選的項目。
講解:identify("xxx",event.x,event.y)
第壹個參數xxx可以是item、column、row,分別使用雙擊時的坐標,取得雙擊時的
item、column或row的信息,此例是使用item,所以我們可以由此獲得是哪壹個項目被
雙擊。
在創建Treeview控件後,由壹個很常見的功能是將欄目信息做排序,通常可以單擊欄位標題就
可以執行排序。
樣例:排序Treeview控件State欄的數據,在這個程序中為了簡化程序,省略了圖標欄。
所以Treeview控件只有壹個State欄,當單擊欄標題時可以正常排序,如果再單擊時可以
反向排序,排序方式將如此切換。
講解:heading()方法,當用鼠標單擊標題欄時會執行command所指定的方法,這是
Lambda表達式,將"states"設置給變量c,然後將c當作參數傳遞給treeview_sortColumn()方法。
get_children([item])
它會傳回item的壹個tuple的iid值,如果省略則是得到壹個tuple,此tuple是top-level的iid值。
move()方法:
move(iid,parent,index)
將iid所指項目移至parent層次的index位置,此程序用""代表parent層次