有沒有辦法在排序后保持替代行著色?我的樹視圖有 2,000 多行,想知道除了在每次對列進行排序時重新標記所有行之外,是否還有其他解決方案。當您單擊任何列時,行顏色會混淆。
環境:Python 3.10.0 Windows 21H1
import tkinter as objTK
from tkinter import ttk as objTTK
from functools import partial
# Custom column sort for treeview
class MyTreeview(objTTK.Treeview):
def heading(self, column, sort_by=None, **kwargs):
if sort_by and not hasattr(kwargs, 'command'):
func = getattr(self, f"_sort_by_{sort_by}", None)
if func:
kwargs['command'] = partial(func, column, False)
# End of if
# End of if
return super().heading(column, **kwargs)
# End of heading()
def _sort(self, column, reverse, data_type, callback):
l = [(self.set(k, column), k) for k in self.get_children('')]
l.sort(key=lambda t: data_type(t[0]), reverse=reverse)
for index, (_, k) in enumerate(l):
self.move(k, '', index)
# End of for loop
self.heading(column, command=partial(callback, column, not reverse))
# End of _sort()
def _sort_by_name(self, column, reverse):
self._sort(column, reverse, str, self._sort_by_name)
# End of _sort_by_num()
# End of class MyTreeview
objWindow = objTK.Tk()
arrlbHeader = ["Type" , "Description"]
treeview = MyTreeview(columns=arrlbHeader, show="headings")
arrRows = [
["Expenses", "Gen"],
["Expenses", "Aug"],
["Expenses", "Aug"],
["Income", "Aug"],
["Expenses", "Aug"]
]
arrColWidth = [70, 80]
arrColAlignment = ["center", "e"]
# Column header and attributes
arrSortType = ["name", "name"]
for iCount in range(len(arrlbHeader)):
strHdr = arrlbHeader[iCount]
treeview.heading(strHdr, text=strHdr.title(), sort_by=arrSortType[iCount])
treeview.column(arrlbHeader[iCount], width=arrColWidth[iCount], stretch=True, anchor=arrColAlignment[iCount])
# End of for loop
treeview.pack()
# Row colouring tags
treeview.tag_configure("tgOddRow", background="white")
treeview.tag_configure("tgEvenRow", background="blue")
# Insert rows
for iCount in range(len(arrRows)):
if iCount % 2 == 0:
treeview.insert("", "end", values=arrRows[iCount], tags="tgEvenRow")
else:
treeview.insert("", "end", values=arrRows[iCount], tags="tgOddRow")
# End of for loop
objWindow.bind("<Escape>", lambda funcWinSer: objWindow.destroy())
objWindow.mainloop()
uj5u.com熱心網友回復:
解決方案是重新標記所有專案。樹形視圖小部件可以在幾分之一秒內重新標記幾千行。
這是一個簡單的例子。它假設您沒有嵌套在其他專案下的專案。如果你這樣做了,那么解釋這一點是相當簡單的。
def retag():
tag = "tgOddRow"
for iid in treeview.get_children(""):
tag = "tgOddRow" if tag == "tgEvenRow" else "tgEvenRow"
treeview.item(iid, tags=(tag,))
當我在具有 10,000 行的樹視圖上運行該函式時,所需時間遠低于 100 毫秒。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/345028.html
