country.xml结构如下:
<data>
<country name="Panama">
<rank>67</rank>
<year>20142</year>
<gdppc>13600</gdppc>
<neighbor direction="W" name="Costa Rica" />
<neighbor direction="E" name="Colombia" />
</country>
</data>
思路:将解析xml文件的代码封装为类,注意界面的布局情况,可以使用Label和Entry等界面组件的grid函数。
import tkinter as tk
import xml.etree.ElementTree as ET
class App:
"""
点击get按钮时
根据用户输入的国家名判断是否时xml文件里面存在的name,若是则返回行营的rank和year值
点击set按钮时
将用户输入的数据按原格式存入xml文件
def __init__(self, root):
# 基本界面
self.root = root
# 所需组件
self.zujian()
def zujian(self):
# 用标签label存放固定的数据,用文本框entry存放可变数据,并用grid固定他们的位置
# set和get用按钮button来创建,再用bind设置他们的响应机制
# 国家name,
tk.Label(self.root, text="country:", height=1,
width=10).grid(row=0, column=0)
self.e1 = tk.StringVar()
self.e11 = tk.Entry(self.root, width=50, textvariable=self.e1)
self.e11.grid(row=0, column=1)
# rank
tk.Label(self.root, text="rank:", height=1,
width=10).grid(row=1, column=0)
self.e2 = tk.IntVar()
self.e22 = tk.Entry(self.root, width=50, textvariable=self.e2)
self.e22.grid(row=1, column=1)
# year
tk.Label(self.root, text="year:", height=1,
width=10).grid(row=2, column=0)
self.e3 = tk.IntVar()
self.e33 = tk.Entry(self.root, width=50, textvariable=self.e3)
self.e33.grid(row=2, column=1)
# get
b = tk.Button(root, text="get", height=1, width=15)
b.grid(row=3, column=0)
b.bind("<Button-1>", self.click)
# set
c = tk.Button(root, text="set", height=1, width=15)
c.grid(row=3, column=1)
c.bind("<Button-1>", self.clean)
def click(self, event):
# 点击get按钮的响应机制
tree = ET.parse('zuoye/country.xml') # 创建xml树
root1 = tree.getroot() # 得到树根
for country in root1.findall('country'): # 循环遍历子节点country
# 判断name是否和用户输入的一致,若一致则输出他们的rank和year的值
if country.get('name') == self.e11.get(): # 子节点下属性name的值
self.e1.set(country.get('name'))
self.e2.set(country.find('rank').text) # 子节点下节点rank的值
self.e3.set(country.find('year').text)
def clean(self, event):
# 点击set按钮的响应机制
# 写入xml
tree = ET.parse('zuoye/country.xml') # 创建xml树
root1 = tree.getroot() # 得到树根
# 创建新的子节点
countrynew = ET.Element('country', {'name': self.e11.get()})
ranknew = ET.SubElement(countrynew, 'rank') # 子节点下节点rank
ranknew.text = self.e22.get()
yearnew = ET.SubElement(countrynew, 'year')
yearnew.text = self.e33.get()
# 向根节点添加新的子节点,可以使用append方法添加子节点
root1.append(countrynew)
# 写入
tree.write('zuoye/country.xml', encoding="utf-8", xml_declaration=True)
root = tk.Tk()
root.title("XML")
App(root)
root.mainloop()
结果:
输入name后:
点击get后:
填入数据:
点击set后: