Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 23, 2024 22:31:39

ZIL130
Зарегистрирован: 2022-10-29
Сообщения: 16
Репутация: +  0  -
Профиль   Отправить e-mail  

Сортировка файлов по расширению в Tkinter TreeView

При добавлении в иерархию нужно отсортировать файлы в паках и подпапках сразу по трём расширениям “.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)

Офлайн

#2 Фев. 24, 2024 14:13:56

rami
Зарегистрирован: 2018-01-08
Сообщения: 281
Репутация: +  72  -
Профиль   Отправить e-mail  

Сортировка файлов по расширению в Tkinter TreeView

     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)

Офлайн

#3 Фев. 24, 2024 15:06:11

ZIL130
Зарегистрирован: 2022-10-29
Сообщения: 16
Репутация: +  0  -
Профиль   Отправить e-mail  

Сортировка файлов по расширению в Tkinter TreeView

Вот спасибо тебе добрый человек.
А то уже мозги поплавились – никак не соображу что и куда воткнуть.
Приступ тупизны кокойты.
Тут вот какое дело – я дико извиняюсь, но я неправильно сформулировал.
Не сортировка, а фильтрация.
Вот как изменён код функции:

  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)

Офлайн

#4 Фев. 26, 2024 12:25:13

ZIL130
Зарегистрирован: 2022-10-29
Сообщения: 16
Репутация: +  0  -
Профиль   Отправить e-mail  

Сортировка файлов по расширению в Tkinter TreeView

В общем проблема решена.
Изменил подход к заполнению дерева.
Код:

  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)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version