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()        
posted @ 2024-08-09 22:29  远方_2408  阅读(53)  评论(0)    收藏  举报