tkinter一个自定义的简单treeview类
tkinter没有表格,所以在实现的时候是以treeview实现。
以下是一个方便使用的treeview类。
点击查看代码
import tkinter
import tkinter as tk
import tkinter.ttk as ttk
from tkinter import *
class MyTreeView(ttk.Treeview):
def __init__(self,root,columns=[],**kwargs):
super().__init__(root,columns=columns, **kwargs)
self.columns=columns
for ix1 in self.columns:
self.column(ix1,width=10)
self.heading(ix1,text=ix1,command=lambda _col=ix1: self.treeview_sort_column(self,_col,False))
yscrollbar_position=tk.Scrollbar(self,orient='vertical',command=self.yview)
self.config(yscrollcommand=yscrollbar_position.set)
yscrollbar_position.pack(sid=tk.RIGHT,fill=tk.Y,expand='no')
self.tree_dict={}
self.sort_mode=0
self.init_stype()
def tree_update(self,data:dict={}): #更新数据,有变化则更改,不变的不更改
key_list=list(self.tree_dict.keys())
for id_ in key_list:
if id_ not in data.keys():
item=self.tree_dict.pop(id_)
self.delete(item)
for id_,value in data.items():
if id_ in self.tree_dict.keys():
item=self.tree_dict[id_]
for ix1 in range(len(self.columns)):
c_name=self.columns[ix1]
if self.set(item,c_name)!=value[ix1]:
self.set(item,c_name,value[ix1])
else:
item=self.insert('', tk.END,text=id_,values=value)
self.tree_dict[id_]=item
def treeview_sort_column(self,tv,col,reverse): #点击列名排序,
if self.sort_mode==0: #原始
reverse_0=reverse
self.sort_mode=-1
elif self.sort_mode==1: #顺序
reverse_0=False
self.sort_mode=-1
else:
reverse_0=True
self.sort_mode=1
l=[(tv.set(k,col),k) for k in tv.get_children('')]
l.sort(reverse=reverse_0)
for index,(val,k) in enumerate(l):
tv.move(k,'',index)
self.tree_remove()
def tree_remove(self): #去掉选择项的焦点,不再选择
while len(self.selection())>0:
self.selection_remove(self.selection()[0])
def init_stype(self): #风格模式,这是python3.8以后的比较麻烦设置
style=tkinter.ttk.Style()
def fixed_map(option):
return [elm for elm in style.map('Treeview',query_opt=option) if elm[:2]!=('!disabled','!selected')]
style.map('Treeview',foreground=fixed_map('foreground'),background=fixed_map('background'))
self.tag_configure('in', foreground='green')
self.tag_configure('out', foreground='red')
self.update()
if __name__=='__main__':
root = tk.Tk()
t=MyTreeView(root,columns=['name','age'],show='headings') #列名为['name','age']
t.pack(side='top',expand=True,fill='both')
t.tree_update({'a001':['abc',40],'a002':['xyz',50],'a003':['jjh',35]}) #更新数据为字典
for item in t.get_children():
print(t.item(item)['values'])
t.item('I001',tags=('in',)) # 设置某一行颜色风格
root.geometry("800x600")
root.mainloop()

浙公网安备 33010602011771号