[英]Python - show an XML file on a TreeView structure
我有遍歷dict對象並將其放在TreeView上的這段代碼。 對於簡單的xml來說可以,但是對於復雜的xml則不起作用。
問題出在walk_dict函數上,但是我做錯了。
#-*- encoding: utf8 -*-
from Tkinter import *
from ttk import Treeview
import xmltodict
class App:
def __init__(self, root):
try:
self.tagsoup = xmltodict.parse(file(sys.argv[1],'r').read())
self.tree = Treeview(root, height=30)
self.tree.pack()
self.last = ''
self.walk_dict(self.tagsoup)
except Exception as e:
print e
def walk_dict(self, d,depth=0):
for k,v in sorted(d.items(),key=lambda x: x[0]):
if isinstance(v, dict):
self.last = k
self.tree.insert('', 'end', k, text = k)
self.walk_dict(v,depth+1)
else:
self.tree.insert(self.last, 'end', k, text = k)
self.tree.insert(k, 'end', v, text = v)
root = Tk()
App(root)
root.mainloop()
我提供的xml是這樣的:
<menu>
<opcao1>Aspargos</opcao1>
<opcao2>Tomate frito</opcao2>
<opcao3>Abóbora caramelizada</opcao3>
<opcao4>Churrasco de ovelha</opcao4>
<opcao5>Pizza</opcao5>
<opcao6>
<lol>Copter</lol>
<meh>lolcopter</meh>
<bla>
<woo>foo</woo>
</bla>
</opcao6>
</menu>
這是輸出。 請注意,opcao6是在樹外渲染的,其子級在下面渲染。
問題在於,無論遞歸有多深,您都始終將項創建為根項的子項。 相反,您需要保存新項目的ID,並在對walk_dict
進行嵌套調用時將其作為新的父項傳遞。
它看起來像這樣:
def walk_dict(self, d,depth=0, parent=""):
for k,v in sorted(d.items(),key=lambda x: x[0]):
item = self.tree.insert(parent, 'end', k, text = k)
if isinstance(v, dict):
self.walk_dict(v,depth+1, parent=item)
else:
self.tree.insert(item, 'end', v, text = v)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.