Форум сайта python.su
При добавлении в иерархию нужно отсортировать файлы в паках и подпапках сразу по трём расширениям “.py”, “pyw”, “pyc”.
Есть код рекурсивного заполнения TreeView:
import tkinter as tk import tkinter.ttk as ttk class App(tk.Frame): def __init__(self, master, path): tk.Frame.__init__(self, master) self.tree = ttk.Treeview(self, selectmode='browse') self.tree.column('#0', minwidth=300, width=160, stretch=tk.YES) style=ttk.Style(self) style.theme_use("clam") style.configure("Treeview", background="gray", fieldbackground="darkgray", foreground="azure") ysb = ttk.Scrollbar(self, orient='vertical', command=self.tree.yview) xsb = ttk.Scrollbar(self, orient='horizontal', command=self.tree.xview) self.tree.configure(yscroll=ysb.set) self.tree.configure(xscroll=xsb.set) self.tree.heading('#0', text='Текущий каталог', anchor='w') abspath = os.path.abspath(path) root_node = self.tree.insert('', 'end', text=abspath, open=True) self.process_directory(root_node, abspath) self.tree.grid(row=0, column=0) ysb.grid(row=0, column=1, sticky='ns') xsb.grid(row=1, column=0, sticky='ew') self.grid() def process_directory(self, parent, path): for p in os.listdir(path): print("p=", p) abspath = os.path.join(path, p) isdir = os.path.isdir(abspath) oid = self.tree.insert(parent, 'end', text=p, open=False) if isdir: self.process_directory(oid, abspath) root = tk.Tk() path_to_my_project = os.getcwd() app = App(root, path=path_to_my_project) app.mainloop()
Отредактировано ZIL130 (Фев. 23, 2024 22:35:20)
Офлайн
def process_directory(self, parent, path): mylist = sorted(sorted(os.listdir(path)), key=lambda x: f"{x}.".split(".")[1]) #сортировать сначала всё, потом по расширению for p in mylist: #поправить print("p=", p) abspath = os.path.join(path, p) isdir = os.path.isdir(abspath) oid = self.tree.insert(parent, 'end', text=p, open=False) if isdir: self.process_directory(oid, abspath)
Офлайн
Вот спасибо тебе добрый человек.
А то уже мозги поплавились – никак не соображу что и куда воткнуть.
Приступ тупизны кокойты.
Тут вот какое дело – я дико извиняюсь, но я неправильно сформулировал.
Не сортировка, а фильтрация.
Вот как изменён код функции:
def process_directory(self, parent, path): mylist = sorted(sorted(os.listdir(path)), key=lambda x: f"{x}.".split(".")[1]) results = [f for f in mylist if f.endswith(('.py', 'pyw', 'pyc'))] for p in results: abspath = os.path.join(path, p) isdir = os.path.isdir(abspath) oid = self.tree.insert(parent, 'end', text=p, open=False) print("oid=", oid) if isdir: self.process_directory(oid, abspath)
Отредактировано ZIL130 (Фев. 25, 2024 00:10:20)
Офлайн
В общем проблема решена.
Изменил подход к заполнению дерева.
Код:
import tkinter as tk from tkinter import ttk import os def populate_folder_structure_treeview(path, parent=""): mylist = sorted(sorted(os.listdir(path)), key=lambda x: f"{x}.".split(".")[1])#сортировка всего(это мне подсказали) for item in mylist: item_path = os.path.join(path, item) is_directory = os.path.isdir(item_path) if is_directory: item_id = tree.insert(parent, "end", text=item, open=False) print("item_id=", item_id) populate_folder_structure_treeview(item_path, parent=item_id) else: if item.endswith(('.py', '.pyw', '.pyc')):#а вот здесь фильтруем по расширениям(и в подкаталогах тоже) fname = tree.insert(parent, "end", text=item) root = tk.Tk() root.title("TreeView for Folder Structure in Tkinter") tree = ttk.Treeview(root) tree.heading('#0', text='Текущий каталог', anchor='w') tree.pack(pady=20) populate_folder_structure_treeview(os.getcwd())
Отредактировано ZIL130 (Фев. 26, 2024 12:26:28)
Офлайн