将 QTreeWidget 转换为 PyQt 中的嵌套字典
Converting a QTreeWidget to a nested dictionary in PyQt
我想这样做的原因是允许用户使用 QTreeWidget
创建文件树,然后我想将该树提取到嵌套的 dict
结构中,并保存它是如何。我考虑过使用 txt
文件和 eval
方法将所有保存的方案简单地加载到某个数组或另一个字典中,其中键是方案的名称,这样用户就可以简单地select 方案或根据需要进行编辑。这自然导致我必须在用户进行 selected 编辑后将保存的 dict
转换回 QTreeWidget
。
现在虽然这是我的问题。
我已经能够使用递归函数成功导航 QTreeWidget
。我纠结的是创建嵌套 dict
.
背后的逻辑
以下是我到目前为止的想法:
def tree_to_dict(self, parent, key):
for i in range(parent.childCount()):
cur_par = parent.child(i)
if cur_par.childCount() == 0:
try:
if type(self.scheme[key]) is dict :
self.scheme[key][cur_par.text(0)] = 'E'
except KeyError:
key = cur_par.text(0)
self.scheme[key] = 'E'
else:
key = cur_par.text(0)
self.scheme[key] = {}
self.tree_to_dict(cur_par, key)
我知道这是错误的。这就是我需要帮助的原因。
以上代码生成以下 dict
形式 QTreeWidget
a
b
a
c
{'a':'E', 'b':{'a':'E', 'c':'E'}}
但应该是:
{'a':'E', 'b':{'a':'E'}, 'c':'E'}
E 仅表示不会再有子目录。
我已经看到了一些其他的实现,但是它们非常混乱,我不太明白它们的逻辑。 This 与我在这里提出的问题几乎重复,但尚未得到解答。我试过调整他的实现,但它(无论如何对我来说)很复杂,很难适应我的程序结构。
您的实施可能比要求的要复杂。
由于每个项目都是键,您需要递归迭代并return该键的值。
如果项目没有children,它将return 'E',否则它将再次调用给定的child的函数,依此类推.
该函数不需要 key 参数,因为它将由递归调用创建。
def tree_to_dict(parent):
childCount = parent.childCount()
if not childCount:
return 'E'
content = {}
for row in range(childCount):
child = parent.child(row)
content[child.text(0)] = tree_to_dict(child)
return content
然后,只需使用 invisibleRootItem()
.
调用函数
我想这样做的原因是允许用户使用 QTreeWidget
创建文件树,然后我想将该树提取到嵌套的 dict
结构中,并保存它是如何。我考虑过使用 txt
文件和 eval
方法将所有保存的方案简单地加载到某个数组或另一个字典中,其中键是方案的名称,这样用户就可以简单地select 方案或根据需要进行编辑。这自然导致我必须在用户进行 selected 编辑后将保存的 dict
转换回 QTreeWidget
。
现在虽然这是我的问题。
我已经能够使用递归函数成功导航 QTreeWidget
。我纠结的是创建嵌套 dict
.
以下是我到目前为止的想法:
def tree_to_dict(self, parent, key):
for i in range(parent.childCount()):
cur_par = parent.child(i)
if cur_par.childCount() == 0:
try:
if type(self.scheme[key]) is dict :
self.scheme[key][cur_par.text(0)] = 'E'
except KeyError:
key = cur_par.text(0)
self.scheme[key] = 'E'
else:
key = cur_par.text(0)
self.scheme[key] = {}
self.tree_to_dict(cur_par, key)
我知道这是错误的。这就是我需要帮助的原因。
以上代码生成以下 dict
形式 QTreeWidget
a
b
a
c
{'a':'E', 'b':{'a':'E', 'c':'E'}}
但应该是:
{'a':'E', 'b':{'a':'E'}, 'c':'E'}
E 仅表示不会再有子目录。
我已经看到了一些其他的实现,但是它们非常混乱,我不太明白它们的逻辑。 This 与我在这里提出的问题几乎重复,但尚未得到解答。我试过调整他的实现,但它(无论如何对我来说)很复杂,很难适应我的程序结构。
您的实施可能比要求的要复杂。
由于每个项目都是键,您需要递归迭代并return该键的值。
如果项目没有children,它将return 'E',否则它将再次调用给定的child的函数,依此类推.
该函数不需要 key 参数,因为它将由递归调用创建。
def tree_to_dict(parent):
childCount = parent.childCount()
if not childCount:
return 'E'
content = {}
for row in range(childCount):
child = parent.child(row)
content[child.text(0)] = tree_to_dict(child)
return content
然后,只需使用 invisibleRootItem()
.