Как отсортировать список в treeview?
Имею код программы, который выводит данные из xml файла в treeview.
from tkinter import *
from tkinter.ttk import Treeview
import xml.etree.ElementTree as ET
class App:
def __init__(self, root):
try:
with open('FileInfo.xml') as f:
read_data = f.read()
ansi = read_data.encode('ansi')
rootNode = ET.fromstring(ansi)
self.tree = Treeview(root)
self.tree.pack(expand=True, fill='both')
self.tree.heading('#0', text=rootNode.get('displayName'), anchor='w')
self.walk_dict(rootNode)
except Exception as e:
print(e)
def walk_dict(self, d, depth=0, parent=""):
for child in d:
if(child.tag == 'folder'):
item = self.tree.insert(parent, 'end', None, text=child.get('displayName'))
elif(child.tag == 'element'):
item = self.tree.insert(parent, 'end', None, text=child.get('file'))
if child.__len__() > 0:
self.walk_dict(child, depth + 1, parent=item)
root = Tk()
root.geometry("500x600")
App(root)
root.mainloop()
Xml файл с содержимым:
<?xml version="1.0"?>
<library displayName="MyLibrary">
<description />
<folder displayName="9_">
<folder displayName="9_">
<element displayName="9_" file="9_.kdw" />
<description>Description.</description>
<element displayName="1_" file="1_.kdw" />
<element displayName="я_" file="я_.kdw" />
<element displayName="а_" file="а_.kdw" />
<element displayName="z_" file="z_.kdw" />
<element displayName="a_" file="a_.kdw" />
</folder>
<folder displayName="1_">
<element displayName="9_" file="9_.kdw" />
</folder>
<folder displayName="я_">
<element displayName="9_" file="9_.kdw" />
</folder>
<folder displayName="а_">
<element displayName="9_" file="9_.kdw" />
</folder>
<folder displayName="z_">
<element displayName="9_" file="9_.kdw" />
</folder>
<folder displayName="a_">
<element displayName="9_" file="9_" />
</folder>
</folder>
<folder displayName="1_">
<element displayName="9_" file="9_.kdw" />
</folder>
<folder displayName="я_">
<element displayName="9_" file="9_.kdw" />
</folder>
<folder displayName="а_">
<element displayName="9_" file="9_" />
</folder>
<folder displayName="z_">
<element displayName="9_" file="9_.kdw" />
</folder>
<folder displayName="a_">
<element displayName="9_" file="9_.kdw" />
</folder>
<element displayName="9_" file="9_.kdw" />
<element displayName="1_" file="1_.kdw" />
<element displayName="я_" file="я_.kdw" />
<element displayName="а_" file="а_.kdw" />
<element displayName="z_" file="z_.kdw" />
<element displayName="a_" file="a_.kdw" />
</library>
Нужно отсортировать все директории и файлы. 1-999..., a-z, а-я.
Судя по всему сортировка должна быть где-то здесь...
ansi = read_data.encode('ansi')
....
rootNode = ET.fromstring(ansi)
Вот что я получаю на данный момент:
Ответы (1 шт):
Автор решения: GrAnd
→ Ссылка
Пишем метод для сортировки:
@staticmethod
def sort_by_attr(node, tags, attr):
return sorted(filter(lambda x: x.tag in tags, node), key=lambda child: child.get(attr))
Если требуется просто отсортировать, то достаточно использовать его так:
def walk_dict(self, d, depth=0, parent=""):
for child in self.sort_by_attr(d, ('folder', 'element'), "displayName"):
...
Правда файлы будут вперемешку с папками.
Если папки надо вынести в начало, то так:
def walk_dict(self, d, depth=0, parent=""):
for child in self.sort_by_attr(d, ('folder'), "displayName"):
item = self.tree.insert(parent, 'end', None, text=child.get('displayName'))
if len(child) > 0:
self.walk_dict(child, depth + 1, parent=item)
for child in self.sort_by_attr(d, ('element'), "file"):
item = self.tree.insert(parent, 'end', None, text=child.get('file'))
