QFileDialog передает каталог в скрипт Python

Я пишу небольшую программу на Python, которая просматривает файл XML и выполняет некоторую замену тегов. Он принимает три аргумента: путь, из которого создается дерево каталогов, файл XML, который он читает, и файл xml, в который он выводится. Он отлично работает из командной строки, просто передавая аргументы. Поскольку это не только для меня, я подумал, что я поставил на него фронт Qt. Ниже представлена ​​большая часть фронта Qt. MOVtoMXF — это класс, который выполняет всю замену. Итак, вы можете видеть, что я просто беру строки и загружаю их в класс, который уже создан и протестирован.

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)

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

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

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

Я работаю на Max OS X 10.5.6 pyQt 4.4.4 QT 4.4.0

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

Отметка


person Mark Lakewood    schedule 11.04.2009    source источник
comment
не могли бы вы опубликовать код в скрипте? и точное сообщение об ошибке?   -  person    schedule 11.04.2009


Ответы (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:

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

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

displayText : const QString 
text : QString

Обновление:

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

Дорожная карта PyQt4

Неявное копирование const&

Реализовано в текущих снимках.

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

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

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

person Community    schedule 11.04.2009