PySide从菜单中导出XML ElementTree - 有问题

时间:2018-02-11 15:55:33

标签: python xml pyqt5 pyside qfile

因此,它不是XML问题,而是PySide / Menu项目。我有一个简单的XML查看器/编辑器用于简单的xml文件,我想保存生成的xml文件。我在此处添加了一个代码段,其功能已删除,以简洁起见。我在这里的重点只是菜单' save'因为这是我似乎最不习惯的事情。

我已经评论了难以保存的'链接。硬链接适用于写入文件。如果我绕过QFile对话框中的QtCore.QFile(filePath)返回并用硬链接替换文件路径,则xlm树将按预期导出。

当我使用对话框菜单时(这是问题),os文件被打开但没有写入任何内容,文件大小保持为' 0'尺寸。这可能是文件锁定问题吗?无法理解为什么这两者不应该同时工作和打开'事物的一面(为了简洁而注释)在构建和查看我的xml树时工作得很好。

任何人都可以帮助我吗?它一定是显而易见的,但也许我已经盯着它看太久了,问题就在眼前!#/ p>

谢谢,

#!/usr/bin/env python
# using python3

from PySide import QtCore, QtGui
from xml.etree.ElementTree import parse, Element


class MainWindow(QtGui.QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()

        self.fileMenu = self.menuBar().addMenu("&File")
        self.fileMenu.addAction("&Open...", self.openFile, "Ctrl+O")
        self.fileMenu.addAction("&Save...", self.saveFile, "Ctrl+S")
        self.fileMenu.addAction("E&xit", self.close, "Ctrl+Q")

        #self.xmlPath = ""
        self.view = QtGui.QTreeView(self)
        # snippet - edit/view code removed here for brevity

        self.setCentralWidget(self.view)
        self.setWindowTitle("XML Editor")

        self.xmlPath = ""
        self.fileIn = ""
        self.fileOut = ""


    def openFile(self):
        filePath,_ = QtGui.QFileDialog.getOpenFileName(self, "Open File",
                self.xmlPath, "XML files (*.xml);;HTML files (*.html);;"
                "SVG files (*.svg);;User Interface files (*.ui)")

        if filePath:
            self.f = QtCore.QFile(filePath)
            print("Open filePath")
            print(self.f.fileName())
            self.fileIn = self.f.fileName()
            #doc = parse(self.fileIn)
            #root = doc.getroot()
            print("fileIn")
            print(self.fileIn)
            self.f.close()


    def saveFile(self):
        fileName = QtGui.QFileDialog.getSaveFileName(self,
                "Save Project File", QtCore.QDir.currentPath(),
                "XML Files (*.xml)")[0]

        if not fileName:
            return

        self.outFile = QtCore.QFile(fileName)
        print("Save outFile")
        self.fileOut = self.outFile.fileName()
        print(self.fileOut)

        doc = parse("catalog.xml")
        root = doc.getroot()

        # setting filename via dialog - uncomment for (working) hardcoded name variable
        doc.write(self.fileOut, xml_declaration=True)

        # but hardcoded name works fine function
        #doc.write("catalog_saved.xml", xml_declaration=True)

        if not self.outFile.open(QtCore.QFile.WriteOnly | QtCore.QFile.Text):
            QtGui.QMessageBox.warning(self, "XML Editor",
                    "Cannot write file %s:\n%s." % (fileName, outFile.errorString()))
            return


if __name__ == '__main__':

    import sys

    app = QtGui.QApplication(sys.argv)
    window = MainWindow()
    window.resize(640, 480)
    window.show()
    sys.exit(app.exec_())

这是测试xml文件catalog.xml:

<?xml version='1.0' encoding='us-ascii'?>
<CATALOG>
  <CD>
    <TITLE>Empire Burlesque</TITLE>
    <ARTIST>Bob Dylan</ARTIST>
    <COUNTRY>USA</COUNTRY>
    <COMPANY>Columbia</COMPANY>
    <PRICE>10.90</PRICE>
    <YEAR>1985</YEAR>
  </CD>
  <CD>
    <TITLE>Hide your heart</TITLE>
    <ARTIST>Bonnie Tyler</ARTIST>
    <COUNTRY>UK</COUNTRY>
    <COMPANY>CBS Records</COMPANY>
    <PRICE>9.90</PRICE>
    <YEAR>1988</YEAR>
  </CD>
  <CD>
    <TITLE>Greatest Hits</TITLE>
    <ARTIST>Dolly Parton</ARTIST>
    <COUNTRY>USA</COUNTRY>
    <COMPANY>RCA</COMPANY>
    <PRICE>9.90</PRICE>
    <YEAR>1982</YEAR>
  </CD>
  <CD>
    <TITLE>Still got the blues</TITLE>
    <ARTIST>Gary Moore</ARTIST>
    <COUNTRY>UK</COUNTRY>
    <COMPANY>Virgin records</COMPANY>
    <PRICE>10.20</PRICE>
    <YEAR>1990</YEAR>
  </CD>
  </CATALOG>

** 更新:实际上我现在通过使用此功能代替上述保存功能解决了这个问题:

def browseClicked(self):
    name = QtGui.QFileDialog.getSaveFileName(self, 'Save File')
    self.browseEdit.setText(name[0])
    doc = parse("catalog.xml")
    root = doc.getroot()
    doc.write(name[0], xml_declaration=True)

它基本上是相同的功能但是分开了,这次我在初始化时将文件名声明为QLineEdit字段而不是字符串。所以也许我有一个字符串对象或初始化问题,虽然原来是返回一个字符串路径,并使用硬编码的文件名路径。仍然试图弄清楚为什么我原来的那个没有用。我讨厌不了解事情。

0 个答案:

没有答案