我想這樣做的原因是允許用戶使用 a 創建檔案樹QTreeWidget,然后我想將該樹提取到嵌套dict結構中,并以某種方式保存它。我已經考慮過使用txt檔案和方法eval將所有保存的方案簡單地加載到某個陣列或另一個字典中,其中鍵是方案的名稱,因此用戶可以簡單地選擇一個方案或根據需要對其進行編輯。這自然導致我必須在用戶選擇編輯后將保存的轉換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 僅表示將不再有子目錄。
我已經看到了其他一些實作,但它們非常令人困惑,我不太明白它們的邏輯。這幾乎是我在這里問的問題的重復,但尚未得到解答。我試過調整他的實作,但它(無論如何對我來說)令人費解并且難以適應我的程式結構。
uj5u.com熱心網友回復:
您的實作可能比要求的復雜。
由于每個專案都是鍵,因此您需要遞回迭代并回傳該鍵的值。
如果該項沒有子項,它將回傳“E”,否則它將使用給定的子項再次呼叫該函式,依此類推。
該函式不需要 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().
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/347802.html
標籤:Python 字典 逻辑 qtreewidget pyqt6
上一篇:在嵌套字典python中計數
