Frage

Im ein kleines Python-Programm zu schreiben, die über eine XML-Datei geht und hat einige Ersatz von Tags. Es dauert drei Argumente, ein Weg von Whcih es einen Verzeichnisbaum erstellt, die XML seine Lesen der Datei und die xml seiner Ausgabe in Datei. Es funktioniert gut von der Kommandozeile nur in Argumenten zu übergeben. Wie es ist nicht nur für mich, ich dachte, id eine Qt Front auf sich. Unten ist die Mehrheit der Qt Front. MOVtoMXF ist die Klasse, die alle den Ersatz der Fall ist. So können Sie, dass im sehen im Grunde nur Saiten greifen und sie in die Klasse Fütterung, die bereits gemacht ive und getestet.

class Form(QDialog):

    def ConnectButtons(self):
        self.connect(self.pathBrowseB, SIGNAL("clicked()"), self.pathFileBrowse)
        self.connect(self.xmlFileBrowseB, SIGNAL("clicked()"), self.xmlFileBrowse)
        self.connect(self.outputFileBrowseB, SIGNAL("clicked()"), self.outputFileBrowse)

    def accept(self):
        path = self.pathBox.displayText()
        xmlFile = self.xmlFileBox.displayText()
        outFileName = self.outfileNameBox.displayText()
        print path + "  " + xmlFile + " " + outFileName
        mov1 = MOVtoMXF.MOVtoMXF(path, xmlFile, outFileName)
        mov1.ScanFile()
        self.done()

    def pathFileBrowse(self):
        file = str(QFileDialog.getExistingDirectory(self, "Select Directory"))
        self.pathBox.setText(file)

    def xmlFileBrowse(self):
        file = str(QFileDialog.getOpenFileName(self, "Save File"))
        self.xmlFileBox.setText(file)

    def outputFileBrowse(self):
        file = str(QFileDialog.getSaveFileName(self, "Save File"))
        self.outfileNameBox.setText(file)

das Probelm ist, dass, wenn ich in einem Pfad füttere, kommt es nun wieder mit einem Fehler, entweder das Verzeichnis doesnt existieren, oder wenn ich einen Schrägstrich am Ende, das

Datei "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/posixpath.py", Zeile 62, in beitreten     Elif Pfad == '' oder path.endswith ( '/'):

ich denke, es ist wahrscheinlich einige Diskrepanz zwischen der QFileDialog, die QString seine vorbei zurück und die Zeichenfolge, die meine Python erwartet. aber ich bin nicht sicher, wie gehen sie zu fixieren.

Im auf Max OS X 10.5.6 läuft pyqt 4.4.4 4.4.0 QT

Vielen Dank für jede Hilfe, die Sie geben können.

Mark

War es hilfreich?

Lösung

Zwei mögliche Lösungen.

Methode 1:

Wenn Sie die displaytext () Methode verwenden müssen, schlage ich vor, Sie den Anruf displaytext wickeln () mit einer expliziten String-Umwandlung:

path = str(self.pathBox.displayText()) 
xmlFile = str(self.xmlFileBox.displayText()) 
outFileName = str(self.outfileNameBox.displayText())

Der Grund dafür ist, dass displaytext () gibt, was ich glaube, ist eine konstante Speicherreferenz auf der C ++ Ebene bedeutet, dass Sie nicht eine Kopie des QString zurückgegeben werden, aber eigentlich alles, was QString ist an der Speicherreferenz zur Verfügung.

Wenn Sie die displaytext () Funktion aufrufen, es ist die Zeichenfolge, die Sie erwartet, aber schließlich ist es etwas anderes, wenn der Inhalt in der Speicherreferenz geändert werden. Ich habe diese Besonderheit mit verschiedenen Methoden auf verschiedenen Kontrollen bemerkt, vor allem QDateEdit / QDateTimeEdit / QTimeEdit Kontrollen, wo ich haben in der Regel eine explizite Kopie zu machen, sagen wir, die QDate durch das Datum () Funktion von QDateEdit zurückgeführt, indem sie in eine Verpackung QDate Konstruktor.

Methode 2:

Verwenden Sie andernfalls den Text () -Methode statt. Die QString zurück ein konstanter Wert ist, statt einer konstanten Speicherreferenz. Sehen Sie diese doc:

http://doc.trolltech.com/4.4/qlineedit.html # text-prop

displayText : const QString 
text : QString

Update:

Es sieht aus wie Flussufer werden dieses Problem in zukünftigen Versionen von PyQt, falls jemand noch werden Adressierung mit diesem Problem:

PyQt4 Roadmap

  

Implizite Kopieren von const &

     

Implementiert in aktuellen Snapshots.

     

Wenn PyQt wickelt eine const & Wert   durch einen C ++ zurück es funktionieren hüllt   die Adresse des Wertes selbst. Ebenfalls,   es erzwingt nicht die const   Attribut. Dies kann zu unerwarteten verursachen   behavour (und Programmabstürzen) entweder   durch den zugrunde liegenden Wert verschwindenden   oder wobei der Wert unerwartet   geändert.

     

Der richtige Weg, dies zu handhaben ist,   machen explizit eine Kopie des Wertes   mit Copykonstruktor seiner Art ist.   Das ist jedoch nicht Pythonic und   wohl wissend, dass es getan werden muss,   erfordert Kenntnisse über die API C ++.

     

PyQt wird geändert, so dass es   rufen automatisch die Kopie   Konstruktor und die Kopie wickeln.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top