Создание древовидной структуры с dict и списками в Python для QTreeView - PullRequest
0 голосов
/ 16 января 2020

Прежде всего, я на практике, и я пытаюсь создать древовидную структуру в Python 3.8, чтобы кормить мой QTreeView.

Я прочитал вывод zfs (subprocess.check_output) и разделил весь материал иметь список с именами пулов:

Пример списка:

pools = ['deadpool','deadpool/Backup','deadpool/Photos','deadpool/Photos/Foobar']

Теперь мне нужно преобразовать и отсортировать весь список по родителю / потомку, и в конце он должен выглядеть так так что я могу использовать его в QTreeView:

{'deadpool': 
            {
              'Backup': {},
              'Photos': {'Foobar': {}},
            } 
}

Я пробовал это с двумя циклами for, но я просто слишком глуп.

Может кто-нибудь показать мне простой пример?

Или в самом QtTreeView / QTreeWidget есть более простой способ?

1 Ответ

0 голосов
/ 17 января 2020

Если я понял твой вопрос, ты хочешь построить древо-виджет из дикта? Если это так, то это очень быстрый пример с Pyside2 (я думаю, что нет проблем с PyQt5 для Treewidget).

data = {
'deadpool':{
    'Backup': {},
    'Photos': {
        'Foobar': {}
        }
    }
}

def build_tree(data=None, parent=None):
    for key, value in data.items():
        item = QTreeWidgetItem(parent)
        item.setText(0, key)
        if isinstance(value, dict):
            build_tree(data=value, parent=item)


window = QWidget()
layout = QVBoxLayout()
window.setLayout(layout)
treewidget = QTreeWidget()
build_tree(data=data, parent=treewidget)
layout.addWidget(treewidget)
window.show()

Если вы просто хотите преобразовать свой список в dict, чтобы использовать его в treewidget вы можете попробовать это:

data = ['deadpool','deadpool/Backup','deadpool/Photos','deadpool/Photos/Foobar']

tree = {}
for path in data:                # for each path
    node = tree                   # start from the very top
    for level in path.split('/'): # split the path into a list
        if level:                 # if a name is non-empty
            node = node.setdefault(level, dict())
                              # move to the deeper level
                              # (or create it if unexistent)

print(tree)

Этот код выше из этого топи c: Stackoverflow

И теперь у вас есть возможность использовать с Первый блок c кода!

Надеюсь, он вам поможет!

...