1. 程式人生 > 其它 >python ttk Treeview的插入、清空、各種點選事件、獲取條目值、標題單擊排序

python ttk Treeview的插入、清空、各種點選事件、獲取條目值、標題單擊排序

插入方法:
import tkinter
from tkinter import ttk # 匯入內部包

li = ['王記','12','男']
root = tkinter.Tk()
root.title('測試')
tree = ttk.Treeview(root,columns=['1','2','3'],show='headings')
tree.column('1',width=100,anchor='center')
tree.column('2',width=100,anchor='center')
tree.column('3',width=100,anchor='center')
tree.heading('1',text='姓名')
tree.heading('2',text='學號')
tree.heading('3',text='性別')
tree.insert('','end',values=li)
tree.grid()

root.mainloop()
(為了省點事就不自己敲了)程式碼來自部落格園提問:https://q.cnblogs.com/q/105829/#a_226277

tree.insert('','end',values=li)

關於“首列很寬”的問題:https://segmentfault.com/q/1010000004206667?sort=created

設定show屬性為 headings 即可隱藏首列。


ttk.Treeview(frame,height=18, show="headings", columns=('a','b','c','d','e','f'))

配上一個還可以的綜合一點的例子https://www.cnblogs.com/Tommy-Yu/p/4156014.html

清空方法:
參考stackoverflow的提問https://stackoverflow.com/questions/32511843/delete-and-edit-items-in-treeview-tkinter

程式碼是對上面的程式碼新增的

import tkinter
from tkinter import ttk # 匯入內部包

li = ['王記','12','男']
root = tkinter.Tk()
root.title('測試')
tree = ttk.Treeview(root,columns=['1','2','3'],show='headings')
tree.column('1',width=100,anchor='center')
tree.column('2',width=100,anchor='center')
tree.column('3',width=100,anchor='center')
tree.heading('1',text='姓名')
tree.heading('2',text='學號')
tree.heading('3',text='性別')
tree.insert('','end',values=li)
tree.grid()

def delButton(tree):
x=tree.get_children()
for item in x:
tree.delete(item)

delButton(tree)

root.mainloop()
(同樣是為了省事……這個就是我在部落格園的那個提問的回答)

另一種方法:來自很有用但是雜的連結:https://www.cnblogs.com/wumac/p/5816764.html

items = your_treeview.get_children()

[your_treeview.delete(item) for item in items]

獲取條目值
同樣沒見到有人問,stackoverflow上才找到的方法

https://stackoverflow.com/questions/34849035/how-to-get-the-value-of-a-selected-treeview-item

import tkinter
from tkinter import ttk # 匯入內部包

li = ['王記','12','男']
root = tkinter.Tk()
root.title('測試')
tree = ttk.Treeview(root,columns=['1','2','3'],show='headings')
tree.column('1',width=100,anchor='center')
tree.column('2',width=100,anchor='center')
tree.column('3',width=100,anchor='center')
tree.heading('1',text='姓名')
tree.heading('2',text='學號')
tree.heading('3',text='性別')
tree.insert('','end',values=li)
tree.grid()


def treeviewClick(event):#單擊
print ('單擊')
for item in tree.selection():
item_text = tree.item(item,"values")
print(item_text[0])#輸出所選行的第一列的值

tree.bind('<ButtonRelease-1>', treeviewClick)#繫結單擊離開事件===========

root.mainloop()

見函式treeview裡的內容

有用的連結:https://www.cnblogs.com/Tommy-Yu/p/4156014.html

各種點選事件
事件一覽表
事件 程式碼 備註
滑鼠左鍵單擊按下 1/Button-1/ButtonPress-1
滑鼠左鍵單擊鬆開 ButtonRelease-1
滑鼠右鍵單擊 3
滑鼠左鍵雙擊 Double-1/Double-Button-1
滑鼠右鍵雙擊 Double-3
滑鼠滾輪單擊 2
滑鼠滾輪雙擊 Double-2
滑鼠移動 B1-Motion
滑鼠移動到區域 Enter
滑鼠離開區域 Leave
獲得鍵盤焦點 FocusIn
失去鍵盤焦點 FocusOut
鍵盤事件 Key
回車鍵 Return
控制元件尺寸變 Configure

來自:https://www.cnblogs.com/wumac/p/5842393.html

用法:

tree.bind('<ButtonRelease-1>', treeviewClick)#繫結單擊離開事件===========
在bind方法裡的'<>'添上相應的事件程式碼就好了,後面的treeview就是我定義的函式

標題點選排序
https://blog.csdn.net/mikewolfli/article/details/51393933(強烈懷疑此連結是沒註明來源,來自下面的連結的程式碼)

https://stackoverflow.com/questions/22032152/python-ttk-treeview-sort-numbers(不按預設桶排序的方法)

https://stackoverflow.com/questions/1966929/tk-treeview-column-sort(python3可用的見此連結最下面)

試驗可執行程式碼

import random
from tkinter import ttk
from tkinter import *

root = Tk() # 初始曠的宣告
columns=("a","b","c")
treeview=ttk.Treeview(root,height=18,show="headings",columns=columns )#表格

treeview.column('a', width=50, anchor='center')
treeview.column('b', width=100, anchor='center')
treeview.column('c', width=80, anchor='center')
treeview.heading('a', text='列1')
treeview.heading('b', text='列2')
treeview.heading('c', text='列3')
treeview.pack(side=LEFT,fill=BOTH)
for i in range(10):
treeview.insert('',i,values=(str(random.randint(0,9)),str(random.randint(0,9)),str(random.randint(0,9))))


def treeview_sort_column(tv, col, reverse):#Treeview、列名、排列方式
l = [(tv.set(k, col), k) for k in tv.get_children('')]
print(tv.get_children(''))
l.sort(reverse=reverse)#排序方式
# rearrange items in sorted positions
for index, (val, k) in enumerate(l):#根據排序後索引移動
tv.move(k, '', index)
print(k)
tv.heading(col, command=lambda: treeview_sort_column(tv, col, not reverse))#重寫標題,使之成為再點倒序的標題

'''
#莫名其妙????寫迴圈的話只有最後一列管用,看論壇說的好像是python2.7管用
for col in columns:
treeview.heading(col, text=col, command=lambda: treeview_sort_column(treeview, col, False))
'''

'''
#基本用法(上邊註釋的只有最後一列管用、索性手工試驗一下可用性,證實可行)
treeview.heading('a', text='123', command=lambda: treeview_sort_column(tree, 'a', False))#重建標題,新增控制元件排序方法
treeview.heading('b', text='111', command=lambda: treeview_sort_column(tree, 'b', False))#重建標題,新增控制元件排序方法
treeview.heading('c', text='223', command=lambda: treeview_sort_column(tree, 'c', False))#重建標題,新增控制元件排序方法
'''

#這個程式碼對於python3就管用了
for col in columns:#給所有標題加(迴圈上邊的“手工”)
treeview.heading(col, text=col, command=lambda _col=col: treeview_sort_column(treeview, _col, False))

root.mainloop()#進入訊息迴圈


————————————————
版權宣告:本文為CSDN博主「超自然祈禱」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處連結及本宣告。
原文連結:https://blog.csdn.net/sinat_27382047/article/details/80161637