在 Python 中为 QTreeView 创建一个带有字典和列表的树结构
Creating a tree structure with dict and lists in Python for QTreeView
首先我没有练习,我试图在 Python 3.8 中创建一个树结构来提供我的 QTreeView。
我阅读了 zfs (subprocess.check_output) 的输出并将所有内容拆分成一个包含池名称的列表:
示例列表:
pools = ['deadpool','deadpool/Backup','deadpool/Photos','deadpool/Photos/Foobar']
现在我必须按 parent/child 对整个列表进行转换和排序,最后它应该看起来像这样,这样我就可以在 QTreeView 中使用它了:
{'deadpool':
{
'Backup': {},
'Photos': {'Foobar': {}},
}
}
我用两个 for 循环试过,但我太笨了..
谁能告诉我一个简单的例子?
或者 QtTreeView/QTreeWidget 本身有更简单的方法吗?
如果我理解你的问题,你想从 dict 构建一个 treewidget 吗?如果是,这是一个非常快速的 Pyside2 示例(我认为 Treewidget 的 PyQt5 没有问题)。
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()
如果您只想将列表转换为字典以便在树形小部件中使用它,您可以试试这个:
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)
上面的代码来自这个主题:
现在你有一个 dict 可以用于第一个代码块!
希望对您有所帮助!
首先我没有练习,我试图在 Python 3.8 中创建一个树结构来提供我的 QTreeView。
我阅读了 zfs (subprocess.check_output) 的输出并将所有内容拆分成一个包含池名称的列表:
示例列表:
pools = ['deadpool','deadpool/Backup','deadpool/Photos','deadpool/Photos/Foobar']
现在我必须按 parent/child 对整个列表进行转换和排序,最后它应该看起来像这样,这样我就可以在 QTreeView 中使用它了:
{'deadpool':
{
'Backup': {},
'Photos': {'Foobar': {}},
}
}
我用两个 for 循环试过,但我太笨了..
谁能告诉我一个简单的例子?
或者 QtTreeView/QTreeWidget 本身有更简单的方法吗?
如果我理解你的问题,你想从 dict 构建一个 treewidget 吗?如果是,这是一个非常快速的 Pyside2 示例(我认为 Treewidget 的 PyQt5 没有问题)。
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()
如果您只想将列表转换为字典以便在树形小部件中使用它,您可以试试这个:
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)
上面的代码来自这个主题:
现在你有一个 dict 可以用于第一个代码块!
希望对您有所帮助!