3.11 tkinter 之 ttk.Treeview

翻譯自 Tree抄腔。

樹視圖(ttk.Treeview)小部件可以顯示并允許瀏覽 Item 的層次結構瓢湃,并可以將每個 Item 的一個或多個屬性顯示為樹右側的列理张。它允許您構建類似于在文件管理器(如 OS X 查找器或 Windows 資源管理器)中找到的樹顯示的用戶界面赫蛇。創(chuàng)建的方式是:

tree = ttk.Treeview(parent)

如果需要,可以按常規(guī)方式添加水平和垂直滾動條雾叭。

1 添加 Item 到 Tree

要對樹視圖執(zhí)行任何有用的操作悟耘,您需要向其中添加一個或多個項。每個項目表示樹中的單個節(jié)點织狐,無論是葉節(jié)點還是內(nèi)部節(jié)點暂幼。項目由唯一 ID 引用;這可以在首次創(chuàng)建項目時由程序員分配移迫,或者小部件可以自動為項目選擇 ID旺嬉。

通過使用樹視圖的 "insert" 方法將 item 插入到樹中來創(chuàng)建項。若要插入項厨埋,需要知道其在樹中的位置邪媳,這意味著指定父項以及新項應在父項的子項列表中插入的位置。

Treeview 小部件會自動創(chuàng)建一個根節(jié)點(未被顯示)荡陷,其 ID 為 "{}"(即空字符串)雨效,可以用作添加的第一個級別項的父級。父項的子項列表中的位置由索引指定(0 是第一個废赞,指定 "end" 索引表示在所有現(xiàn)有子級之后插入)徽龟。

通常,您還將指定顯示在樹中的每個項的名稱唉地。名稱旁邊還有其他選項可以添加圖像据悔,指定節(jié)點是打開還是關閉传透,等等。

方法 insert 的使用方法是:tree.insert(parent, index, iid=None, **kw)极颓,可以看使用的例子:

圖1 insert 函數(shù)的使用范例

從圖1 可以看出如果指定 iid旷祸,則 insert 方法會返回 iid 名稱,否則返回被自動分配的 iid 的值讼昆。

圖2 樹視圖的例子

2 重新排列項目

可以將節(jié)點(及其后代(如果有)移動到樹中的不同位置托享;將節(jié)點及其后代(如果有)移動到樹中的不同位置。唯一的限制是節(jié)點不能在其子級下移動浸赫。目標位置通過父位置指定闰围,并索引到子項列表中,就像使用 "insert" 所做的那樣既峡。比如:

 # 移動 widgets 到 gallery 之下
tree.move('widgets', 'gallery', 'end') 

可以將項從樹中分離(detached )羡榴,該樹從層次結構中刪除項及其后代,但不會銷毀項运敢,從而允許您稍后使用"move"重新插入它們校仑。

tree.detach('widgets')

也可以使用 delete 刪除項目:

tree.delete('widgets')

如果要導航層次結構,有一些方法允許您查找項("parent")的父項传惠,查找項的下一個或以前的同級項("next""prev")迄沫,并返回項("children")的子項列表。

您可以通過修改 "open" 項配置選項來控制項目是否處于打開狀態(tài)并顯示其子項卦方。

tree.item('widgets', open=True)
isopen = tree.item('widgets', 'open')

3 顯示每個項目的信息

樹視圖還可以顯示有關每個項目的一個或多個附加信息羊瘩,這些信息顯示為主樹顯示右側的列。

同樣盼砍,每列都由您分配的符號名稱引用尘吗。無論是在首次創(chuàng)建小部件時,還是以后創(chuàng)建小部件,您均可以使用樹視圖小部件的 "columns" 配置選項指定 columns 的列表浇坐。

tree = ttk.Treeview(root, columns=('size', 'modified', 'owner'))
# 等價于
tree['columns'] = ('size', 'modified', 'owner')

您可以指定列的寬度睬捶、列中項信息的顯示方式對齊等。還可以提供有關列標題的信息近刘,例如要顯示的文本擒贸、可選圖像、對齊方式以及單擊項時要調用的腳本(例如跌宛,對樹進行排序)酗宋。

tree.column('size', width=100, anchor='center')
tree.heading('size', text='Size')

可以單獨指定要在每個項的每一列中放置的值,也可以通過提供項的值列表來指定疆拘。在后一種情況下蜕猫,這是使用 "values" 項配置選項(因此可以在首次插入項時或更高版本使用),該選項采用值列表;列表的順序必須與小部件配置選項 "columns" 中的順序相同哎迄。

tree.set('widgets', 'size', '12KB')
size = tree.set('widgets', 'size')
tree.insert('', 'end', text='Listbox', values=('15KB Yesterday mark'))

4 項目外觀和事件

與文本和畫布小部件一樣回右,樹視圖小部件使用標記來幫助修改樹中項的外觀隆圆。您可以使用 "tags" 項配置選項(在創(chuàng)建項時或以后創(chuàng)建項時)為每個項分配標記列表。
然后可以指定標記配置選項翔烁,然后應用于具有該標記的所有項目渺氧。有效的標記選項包括 "foreground"(文本顏色), "background", "font" 和 "image"(如果項目指定自己的圖像)。

您還可以在標記上創(chuàng)建事件綁定蹬屹,從而捕獲鼠標單擊侣背、鍵盤事件等。

tree.insert('', 'end', text='button', tags=('ttk', 'simple'))
tree.tag_configure('ttk', background='yellow')
 # the item clicked can be found via tree.focus()
tree.tag_bind('ttk', '<1>', itemClicked) 

樹視圖將生成虛擬事件"<TreeviewSelect>", "<TreeviewOpen>" 和 "<TreeviewClose>" 允許您監(jiān)視對用戶所做的小部件的更改慨默。您可以使用 "selection" 方法來確定當前選擇(也可以從程序更改所選內(nèi)容)贩耐。

5 自定義顯示

treeview 小部件的顯示方式有很多,您可以對其進行自定義厦取。其中一些我們已經(jīng)看到潮太,如項目的文本,字體和顏色虾攻,列標題的名稱铡买,以及更多。下面是一些額外的霎箍。

  • 使用 "height" 小部件配置選項指定要顯示的所需行數(shù)奇钞。
  • 使用列的 "width" 或者 "minwidth" 選項控制每列的寬度∨缶冢可以使用符號名稱 "#0" 訪問持有樹的列蛇券。小部件請求的總寬度基于列寬度的總和缀壤。
  • 使用小部件配置選項 "displaycolumns" 選擇要顯示的列和顯示順序樊拓。
  • 您可以選擇使用小部件配置選項 "show"(默認為 "tree headings" 以同時顯示兩個標題)隱藏一個或兩個列標題或樹本身(僅保留列)。
    您可以指定用戶是否可以通過小部件配置選項 "selectmode" 選擇單個項目或多個項塘慕,傳遞 "browse"(單個項目)筋夏、"extended"(多個項目、默認值)或 "none"图呢。
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末条篷,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子蛤织,更是在濱河造成了極大的恐慌赴叹,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件指蚜,死亡現(xiàn)場離奇詭異乞巧,居然都是意外死亡,警方通過查閱死者的電腦和手機摊鸡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進店門绽媒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蚕冬,“玉大人,你說我怎么就攤上這事是辕《谌龋” “怎么了?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵获三,是天一觀的道長旁蔼。 經(jīng)常有香客問我,道長疙教,這世上最難降的妖魔是什么牌芋? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮松逊,結果婚禮上躺屁,老公的妹妹穿的比我還像新娘。我一直安慰自己经宏,他們只是感情好犀暑,可當我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著烁兰,像睡著了一般耐亏。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上沪斟,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天广辰,我揣著相機與錄音,去河邊找鬼主之。 笑死择吊,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的槽奕。 我是一名探鬼主播几睛,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼粤攒!你這毒婦竟也來了所森?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤夯接,失蹤者是張志新(化名)和其女友劉穎焕济,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體盔几,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡晴弃,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片肝匆。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡粒蜈,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出旗国,到底是詐尸還是另有隱情枯怖,我是刑警寧澤,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布能曾,位于F島的核電站度硝,受9級特大地震影響,放射性物質發(fā)生泄漏寿冕。R本人自食惡果不足惜蕊程,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望驼唱。 院中可真熱鬧藻茂,春花似錦、人聲如沸玫恳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽京办。三九已至掀序,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間惭婿,已是汗流浹背不恭。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留财饥,地道東北人换吧。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像佑力,于是被迫代替她去往敵國和親式散。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,927評論 2 355