2009-04-11 11 views
1

J'écris un petit programme python qui passe par un fichier XML et fait un peu de remplacement de balises. Il prend trois arguments, un chemin d'où il crée une arborescence de répertoires, le fichier XML sa lecture et le fichier xml dont il sort. Cela fonctionne très bien à partir de la ligne de commande en passant simplement des arguments. Comme ce n'est pas juste pour moi, je pensais que je mettais un Qt en avant. Ci-dessous la majorité du front Qt. MOVtoMXF est la classe qui fait tout le remplacement. Donc, vous pouvez voir que je suis simplement en train d'attraper des ficelles et les nourrir dans la classe que j'ai déjà fait et testé.QFileDialog passant le répertoire au script python

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) 

le probelm est que quand je nourris dans un chemin, il est maintenant de retour avec une erreur, que ce soit le répertoire ne marche pas exister, ou si j'ai un slash à la fin que

fichier «/System/Bibliothèque/Frameworks/Python.framework/Versions/2.5/lib/python2.5/posixpath.py ", ligne 62, jointure elif path == '' ou path.endswith ('/'):

Je pense que c'est probablement une discordance entre le QFileDialog, le QString et la chaîne attendue par my python. mais je ne sais pas comment y remédier.

Im course sur Max OS X 10.5.6 PyQt 4.4.4 QT 4.4.0

Merci pour toute aide que vous pouvez donner.

Marque

+0

pouvez-vous écrire le code dans le script? et le message d'erreur exact? –

Répondre

1

Deux solutions potentielles.

Méthode 1:

Si vous devez utiliser la méthode displayText(), je vous suggère envelopper l'appel à displayText() avec un casting de chaîne explicite:

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

La raison est que displayText () renvoie ce que je crois être une référence de mémoire constante au niveau C++, ce qui signifie que vous n'êtes pas renvoyé une copie de la chaîne QString, mais en fait quelle que soit la chaîne QString disponible à la référence de la mémoire. Quand vous appelez la fonction displayText(), c'est la chaîne que vous attendiez, mais finalement c'est autre chose quand le contenu de la référence mémoire est changé. J'ai remarqué cette particularité avec plusieurs méthodes sur différents contrôles, notamment les contrôles QDateEdit/QDateTimeEdit/QTimeEdit, où je dois généralement faire une copie explicite de, disons, le QDate retourné par la fonction date() de QDateEdit en l'enveloppant dans un Constructeur QDate.

Méthode 2:

Dans le cas contraire, utiliser la méthode text() à la place. Le QString retourné est une valeur constante, au lieu d'une référence mémoire constante.Voir cette doc:

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

displayText : const QString 
text : QString 

Mise à jour:

Il ressemble à Riverbank se penchera sur ce problème dans les futures versions de PyQt à quiconque de cas est d'avoir encore ce problème:

PyQt4 Roadmap

Copie implicite de const &

Implémenté dans les instantanés actuels.

Lorsque PyQt enveloppe une valeur const & renvoyé par une fonction C++ qu'elle enveloppe l'adresse de la valeur elle-même. En outre, il n'applique pas l'attribut const . Cela peut provoquer un comportement inattendu (et des incidents de programme) par la valeur sous-jacente disparaissant ou la valeur étant de manière inattendue modifiée.

La façon correcte de gérer ceci est de faire explicitement une copie de la valeur en utilisant le constructeur de copie de son type. Cependant, ce n'est pas Pythonic et sachant qu'il doit être fait nécessite une connaissance de l'API C++.

PyQt sera modifié de sorte qu'il invoquera automatiquement le constructeur de copie et emballera la copie.

Questions connexes