簡體   English   中英

在Python中打開XML文件並添加用戶輸入

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

我正在使用python 2.7創建一個程序,使用Tkinter作為GUI和elementtree,其中用戶輸入的數據存儲在XML文件中。 我設法使用python創建了XML文件,並將其保存到文件'crimeFile.xml',其中包含所有空標記。 GUI還顯示允許用戶輸入文本的字段和文本框。 問題是,當我嘗試保存條目時,出現錯誤,並且數據沒有保存到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()

我得到的錯誤是:

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'

該程序的作用是創建一個XML文件供用戶多次輸入使用。 更新新條目並將其存儲在此XML文件中(不覆蓋以前的條目),以便以后可以搜索它並生成報告。 我是python的新手,不知道我要去哪里錯了?

您的應用程序實例沒有任何名為crimeReport屬性

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

crimeReport僅在您的create_XML方法中定義。 您可以將crimeReport定義為類屬性。

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

並在您的方法中使用self.crimeReport

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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