2009-04-11 4 views
1

Im, пишущий небольшую программу python, которая проходит через XML-файл и выполняет некоторую замену тегов. Он принимает три аргумента, путь, из которого он создает дерево каталогов, XML-файл, его чтение и XML-файл, на который он выводит. Он отлично работает из командной строки, просто передавая аргументы. Поскольку это не только для меня, я думал, что id положил на него Qt. Ниже представлена ​​большая часть фронта Qt. MOVtoMXF - это класс, который выполняет всю замену. Таким образом, вы можете видеть, что им в основном просто хватают струны и кормят их в класс, который уже сделан и протестирован.QFileDialog передача каталога в скрипт 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) 

probelm в том, что, когда я кормить в пути, теперь он возвращается с ошибкой, либо каталог оленья кожа существует, или если у меня есть слэш на конце, что

Файл «/ System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/posixpath.py ", строка 62, в соединении elif path == '' или path.endswith ('/'):

Я думаю, что это, вероятно, некоторое несоответствие между QFileDialog, QString его передачей и строкой, которую ожидает мой python. но я не уверен, как это сделать.

Im бегущие на Max OS X 10.5.6 PyQt 4.4.4 QT 4.4.0

спасибо за любую помощь вы можете дать.

Mark

+0

Вы могли бы оставить код в сценарии? и точное сообщение об ошибке? –

ответ

1

Два потенциальных решения.

Метод 1:

Если вы должны использовать метод DisplayText(), я предлагаю вам обернуть вызов DisplayText() с явной строки гипсе:

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

Причина заключается в том, что DisplayText () возвращает то, что, по моему мнению, является постоянной ссылкой на память на уровне C++, а это означает, что вы не возвращаете копию QString, но на самом деле все, что QString доступно в ссылке на память.

Когда вы вызываете функцию displayText(), это строка, которую вы ожидали, но в конечном итоге это что-то еще, когда содержимое в ссылке на память изменяется. Я заметил эту особенность с помощью нескольких методов для разных элементов управления, в первую очередь элементов управления QDateEdit/QDateTimeEdit/QTimeEdit, где обычно приходится делать явную копию, скажем, QDate, возвращаемой функцией date() QDateEdit, путем ее обертывания Конструктор QDate.

Способ 2:

В противном случае, используйте метод текст() вместо этого. Возвращаемое значение QString является постоянным значением, а не ссылкой на постоянную память.Смотрите этот документ:

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

displayText : const QString 
text : QString 

Update:

Похоже Ривербанк будет рассматривать эту проблему в будущих версиях PyQt в случае кто-нибудь еще с этой проблемой:

PyQt4 Roadmap

Неявное копирование константы &

Выполнено в текущих моментальных снимках.

Когда PyQt обертывает & значения константных возвращаемое C++ функции, которую он обертывает адрес самого значения. Кроме того, не применяет атрибут const . Это может привести к непредвиденному поведению (и сбоям программы) либо по базовому значению, исчезающему , либо неожиданному значению .

Правильный способ справиться с этим: явно сделать копию значения с использованием конструктора копии своего типа. Однако это не Pythonic и , зная, что это нужно сделать. требует знания API C++.

PyQt будет изменен так, чтобы он автоматически вызывал копию конструктора и завернул копию.

Смежные вопросы