Python PyQt4和PyQt5中的QFileDialog字符串之间是否存在差异?

Python PyQt4和PyQt5中的QFileDialog字符串之间是否存在差异?,python,pyqt,pyqt4,pyqt5,qfiledialog,Python,Pyqt,Pyqt4,Pyqt5,Qfiledialog,我有一段代码,可以使用Python3和PyQt5打开QFileDialog: from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QFileDialog import sys class MCVE(QWidget): def __init__(self): super().__init__() self.initialize() def initialize(sel

我有一段代码,可以使用Python3和PyQt5打开QFileDialog:

from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QFileDialog
import sys


class MCVE(QWidget):

    def __init__(self):
        super().__init__()
        self.initialize()

    def initialize(self):
        self.setWindowTitle('MCVE')
        self.setGeometry(50, 50, 400, 200)
        btn = QPushButton('Example', self)
        btn.clicked.connect(self.clicked)

        self.show()

    def clicked(self):
        filename = QFileDialog.getOpenFileName(
            self, "Open Template", "c:\\",
            "Templates (*.xml);;All Files (*.*)")

        print(filename)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = MCVE()
    sys.exit(app.exec_())
在使用PyQt4的Python 2中,在按下cancel按钮后,print(filename)语句将作为空字符串输出。当我使用PyQt5在Python 3中运行相同的代码时,我得到:

('','')

注:引号为单引号

有人能解释一下发生了什么事吗?我在PyQt4和PyQt5之间的文档中找不到任何内容。我知道Python2和Python3之间的字符串发生了变化,但我不确定这些变化是否会导致这样的问题。谢谢

PyQt4中的函数返回一个字符串,该字符串是所选文件的名称,如果未选择任何文件,则返回一个空字符串

filename = QFileDialog.getOpenFileName(self, "Open Template", "c:\\", "Templates (*.xml);;All Files (*.*)")
但是,在PyQt5中,它返回一个包含2个元素的元组,其中第一个元素是一个与PyQt4中行为相同的字符串,第二个元素是使用的过滤器

filename, filters = QFileDialog.getOpenFileName(self, "Open Template", "c:\\", "Templates (*.xml);;All Files (*.*)")

注意:PyQt5的大部分文档都在Qt5中,因为通常方法的名称、输入和结果都是相似的。

不清楚标题中的AttributeError如何与正文中描述的内容相关。“你是不是得到了一个属性错误?”@eyllanesc这完全是我的错,当我点击“问问题”时,在我弄清楚发生了什么之前,我有一个问题要问。因此,标题就是从这一点确定的。我已经更新了这个@eyllanesc在Python 2.7.14和PyQt 4.11.4中它似乎是空的在这种情况下,消除过滤器部分的最可靠的方法是什么,这样我得到一个只包含路径名和文件的字符串?基本上模仿PyQt4在转换为PyQt5时的行为。示例C:\SomeArricryDirectory\file.xml问了之后看到了,谢谢!就像你描述的那样