簡體   English   中英

Python-在TreeView結構上顯示XML文件

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM