QFileDialog vorbei Verzeichnis Python-Skript
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
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:
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.