QFileDialog pasar directorio para script en Python
Pregunta
Estoy escribiendo un pequeño programa en Python que pasa a través de un archivo XML y hace algo de sustitución de las etiquetas. Toma tres argumentos, un camino desde lo que se agradece que crea un árbol de directorios, el archivo XML de su lectura y el archivo XML de su salida a. Funciona bien desde la línea de comandos de paso de argumentos. Ya que no es sólo para mí, pensé Identificación ponen un frente Qt en él. A continuación se muestra la mayoría de la parte delantera de Qt. MOVtoMXF es la clase que hace todo el reemplazo. Así se puede ver que, básicamente, sólo im agarrar las cuerdas y la alimentación de ellos en la clase que ya ive hecho y probado.
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)
la probelm es que cuando se alimentan en un camino, que ahora vuelve con un error, existe tampoco el imposible de directorio, o si tengo una barra final en el extremo que
Archivo "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/posixpath.py", línea 62, en unirse camino elif == '' o path.endswith ( '/'):
Creo que es probablemente una falta de coincidencia entre la QFileDialog, el QString su paso hacia atrás y la cadena de los mis Espera pitón. pero no estoy seguro de cómo ir sobre la fijación de la misma.
Im corriendo en Max OS X 10.5.6 4.4.4 pyqt QT 4.4.0
Gracias por cualquier ayuda que puede dar.
Marcar
Solución
Dos posibles soluciones.
Método 1:
Si tiene que usar el método displayText (), sugiero que se coloca la llamada a displayText () con un reparto cadena explícito:
path = str(self.pathBox.displayText())
xmlFile = str(self.xmlFileBox.displayText())
outFileName = str(self.outfileNameBox.displayText())
La razón es que displayText () devuelve lo que creo que es una referencia a memoria constante en el nivel C ++, lo que significa que no se están devolviendo una copia del QString, pero en realidad lo QString está disponible en la referencia de memoria.
Cuando se llama a la función displayText (), que es la cadena que esperaba, pero con el tiempo es algo más cuando se cambian los contenidos en la referencia de memoria. Me he dado cuenta esta peculiaridad con varios métodos en diferentes controles, más notablemente los controles / QDateTimeEdit / QTimeEdit QDateEdit, donde por lo general tiene que hacer una copia explícita de, por ejemplo, el método QDate devuelto por la función date () de QDateEdit envolviéndolo en una constructor método QDate.
Método 2:
Si no, utilizar el método de texto () en su lugar. El QString devuelto es un valor constante, en lugar de una referencia de memoria constante. Ver este documento:
http://doc.trolltech.com/4.4/qlineedit.html # text-prop
displayText : const QString
text : QString
Actualización:
Parece que Ribera se dirigirá a este problema en futuras versiones de PyQt en caso de que alguien sigue teniendo este problema:
Copia implícito const y
Implementado en las instantáneas actuales.
Cuando PyQt envuelve una constante y el valor devuelto por un C ++ función de TI envuelve la dirección del propio valor. También, no hace cumplir la const atributo. Esto puede causar inesperado Behavour (y programa se bloquea) o bien por el valor subyacente desaparición o el valor de ser inesperadamente modificado.
La forma correcta de manejar esto es explícitamente hacer una copia del valor usando constructor de copia de su tipo. Sin embargo, eso no es Pythonic y sabiendo que hay que hacer requiere el conocimiento de API el C ++.
PyQt se cambiará de modo que se invocar automáticamente la copia constructor y envolverá la copia.