简体   繁体   English

在Python中打开XML文件并添加用户输入

[英]Open XML file in Python and add user input

I am creating a program with python 2.7, using Tkinter as the GUI, and elementtree, where the data entered by the user is stored in an XML file. 我正在使用python 2.7创建一个程序,使用Tkinter作为GUI和elementtree,其中用户输入的数据存储在XML文件中。 I have managed to create the XML file using python and this saves to the file 'crimeFile.xml', with all empty tags. 我设法使用python创建了XML文件,并将其保存到文件'crimeFile.xml',其中包含所有空标记。 The GUI also displays the fields and text boxes that allow the user to enter in text. GUI还显示允许用户输入文本的字段和文本框。 The problem is that when I try and save an entry, I get an error, and the data is not saved to the XML file. 问题是,当我尝试保存条目时,出现错误,并且数据没有保存到XML文件中。

from xml.etree import ElementTree
from xml.etree.ElementTree import Element
from xml.etree.ElementTree import SubElement
import xml.etree.ElementTree as ET
from Tkinter import *

class Application(Frame):

    def create_XML(self):
        crimeReport = Element('crime report')
        caseNo = SubElement(crimeReport, 'case number')

        victimDetails = SubElement(caseNo, 'victim details')
        victimFirstName = SubElement(victimDetails, 'victims first name')
        victimSecondName = SubElement(victimDetails, 'victim surname')
        victimAddress = SubElement(victimDetails, 'victim address')

        output_file = open('crimeFile.xml', 'w')
        output_file.write('<?xml version="1.0"?>')
        output_file.write(ElementTree.tostring(crimeReport))
        output_file.close()

    def save_XML(self):

        record = ET.SubElement(self.crimeReport, 'crime report')      
        caseNoNode = ET.SubElement(record, 'case number')
        caseNoNode.text = self.caseNo.get()
        victimFirstNameNode = ET.SubElement(record, 'first name')
        victimFirstNameNode.text = self.victimFirstName.get()
        victimSecondNameNode = ET.SubElement(record, 'surname')
        victimSecondNameNode.text = self.victimSecondName.get()
        victimAddressNode = ET.SubElement(record, 'address')
        victimAddressNode.text = self.victimAddress.get()

        self.tree.write('crimeReport.xml')
        self.clear_field()


    def create_Widgets(self):
        self.save = Button(self)
        self.save["text"] = "Save",
        self.save["command"] = self.save_XML
        self.save["bg"]   = "cyan"
        self.save.grid(row=0,column =2,sticky=W+E+N+S)

        self.crimeReportLabel = Label(self, text = 'Crime Report')
        self.crimeReportLabel.grid(row=1,column =1,sticky=W)

        self.caseNoLabel = Label(self,text="Case Number")
        self.caseNoLabel.grid(row=2,column =1,sticky=W)
        self.caseNo = Entry(self)
        self.caseNo.grid(row=2,column =2,sticky=W)

        self.victimDetailsLabel = Label(self,text="Victim Details")
        self.victimDetailsLabel.grid(row=3,column =1,sticky=W)

        self.victimFirstNameLabel = Label(self,text="First Name")
        self.victimFirstNameLabel.grid(row=4,column =1,sticky=W)
        self.victimFirstName = Entry(self)
        self.victimFirstName.grid(row=4,column =2,sticky=W)

        self.victimSecondNameLabel = Label(self,text="Surname")
        self.victimSecondNameLabel.grid(row=4,column =3,sticky=W)
        self.victimSecondName = Entry(self)
        self.victimSecondName.grid(row=4,column =4,sticky=W)

        self.victimAddressLabel = Label(self,text="Address")
        self.victimAddressLabel.grid(row=6,column =1,sticky=W)
        self.victimAddress = Entry(self)
        self.victimAddress.grid(row=6,column =2,sticky=W)

    def __init__(self, master = None):
        Frame.__init__(self, master)
        self.grid(column=5,row=25)
        self.create_Widgets()
        self.create_XML()


crimeReport = Tk()
app = Application(master = crimeReport)
app.mainloop()
crimeReport.destroy()

The error that I get is: 我得到的错误是:

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Python27\lib\lib-tk\Tkinter.py", line 1532, in __call__
    return self.func(*args)
  File "C:\Users\Laleh\workspace\AdvDB20-02\program1\program1.py", line 60,  in save_XML
    record = ET.SubElement(self.crimeReport, 'crime report')
AttributeError: Application instance has no attribute 'crimeReport'

What the program is meant to do is create an XML file to use, for multiple entries by the user. 该程序的作用是创建一个XML文件供用户多次输入使用。 Update and store the new entries in this XML file (not overriding the previous ones), so that later it can be searched and a report produced. 更新新条目并将其存储在此XML文件中(不覆盖以前的条目),以便以后可以搜索它并生成报告。 I'm a newbie to python and am not sure where I am going wrong? 我是python的新手,不知道我要去哪里错了?

Your application instance doesn't have any attribute named crimeReport 您的应用程序实例没有任何名为crimeReport属性

def save_XML(self):
    record = ET.SubElement(self.crimeReport, 'crime report')
                           ^

crimeReport is only defined in your create_XML method. crimeReport仅在您的create_XML方法中定义。 You can define crimeReport as class attribute instead. 您可以将crimeReport定义为类属性。

class Application(Frame):
    crimeReport = Element('crime report')

and use self.crimeReport in your methods 并在您的方法中使用self.crimeReport

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM