【问题标题】:Create tree hierarchy using os.walk and gobject gtk+3使用 os.walk 和 gobject gtk+3 创建树层次结构
【发布时间】:2013-10-07 01:26:57
【问题描述】:

我正在尝试创建一个简单的文件浏览器。我正在尝试为文件添加树层次结构。我编写了一个正确打印层次结构的示例方法,但是我很难对相同的概念进行建模以创建 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])

我只是在附加文件名时坚持创建适当的迭代器。现在上面的代码只是嵌套所有目录,因为父目录是附加到存储的最后一个目录。有什么想法我会怎么做?

【问题讨论】:

    标签: python gtk python-3.2 pygobject


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2017-04-18
      • 1970-01-01
      • 2011-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多