Создайте древовидную иерархию, используя os.walk и gobject gtk+3
Я пытаюсь создать простой файловый браузер. Я пытаюсь добавить иерархию деревьев для файлов. Я написал пример метода, который правильно печатает иерархию, но мне трудно смоделировать ту же концепцию, чтобы создать Gtk.TreeStore
объект. Ниже приведен пример кода для перечисления файлов:
def list_files(startpath):
for dirname, subdirs, files in os.walk(startpath):
level = dirname.replace(startpath, '').count(os.sep)
indent = ' ' * 4 * (level)
print('{}{}/'.format(indent, os.path.basename(dirname)))
subindent = ' ' * 4 * (level + 1)
for f in files:
print('{}{}'.format(subindent, f))
И следующий код для создания Gtk.TreeStore
:
def add_paned(self):
paned = Gtk.Paned.new(Gtk.Orientation.HORIZONTAL)
TEST_DIR = '/home/myuser'
store = MyTreeStore(str)
store.generate_tree(TEST_DIR)
treeview = Gtk.TreeView(store)
renderer = Gtk.CellRendererText()
column = Gtk.TreeViewColumn("FileName", renderer, text=0)
treeview.append_column(column)
paned.add1(treeview)
self.add(paned)
return paned
MyTreeStore
учебный класс:
from gi.repository import Gtk
import os
class MyTreeStore(Gtk.TreeStore):
def __init__(self, *arg):
super(MyTreeStore, self).__init__(*arg)
def generate_tree(self, path):
parent = None;
for dirname, subdirs, files in sorted(os.walk(path)):
# level = dirname.replace(path, '').count(os.sep)
# iter = self.get_iter_from_string('{}'.format(level))
parent = self.append(parent, [os.path.basename(dirname)])
print(os.path.basename(dirname))
for file in sorted(files):
self.append(parent, [file])
Я просто застрял на создании правильных итераторов при добавлении имен файлов. Прямо сейчас приведенный выше код просто вкладывает все каталоги, так как родительский является последним каталогом, добавленным в хранилище. Есть идеи, как мне поступить?
1 ответ
Прошло 8 лет с тех пор, как был задан вопрос. Но для тех, кто заглянет сюда позже, вот решение:
def generate_tree(self, path):
store = Gtk.TreeStore(str)
base_path = os.path.dirname(path)
directories = {base_path: None}
for dirname, subdirs, files in os.walk(path):
parent_directory_row = directories[os.path.dirname(dirname)]
directories[dirname] = store.append(parent_directory_row, [os.path.basename(dirname)])
for file in files:
store.append(directories[dirname], [file])
return store