Python 为什么PyQt4对话框OpenFileName会冻结,直到其他线程在Linux下完成

Python 为什么PyQt4对话框OpenFileName会冻结,直到其他线程在Linux下完成,python,python-3.x,qt4,pyqt4,freeze,Python,Python 3.x,Qt4,Pyqt4,Freeze,在Linux下,QFileDialog.getOpenFileNames()冻结在一个脚本中,该脚本在其他进程完成之前没有其他GUI,即使它在单独的线程或Qthread中运行 我已经在Ubuntu x64 14.04到16.04下进行了测试 (python 3.4.4/3.5.1+libqt4 dev 4.8.6/4.8.7+python3-pyqt4 4.9.1/4.11.4) 但令人惊讶的是,它在Windows 7下可以正常工作,不会冻结! (python-3.4.4.amd64+PyQt4

在Linux下,QFileDialog.getOpenFileNames()冻结在一个脚本中,该脚本在其他进程完成之前没有其他GUI,即使它在单独的线程或Qthread中运行

我已经在Ubuntu x64 14.04到16.04下进行了测试 (python 3.4.4/3.5.1+libqt4 dev 4.8.6/4.8.7+python3-pyqt4 4.9.1/4.11.4)

但令人惊讶的是,它在Windows 7下可以正常工作,不会冻结! (python-3.4.4.amd64+PyQt4-4.11.4-gpl-Py3.4-Qt4.8.7-x64)


正如Ekhumaro所建议的,问题来自gtk桌面下的本机对话框


将“options=QtGui.QFileDialog.DontUseNativeDialog”添加到getOpenFileNames的参数中可以完全解决问题(没有冻结或错误消息)。

无法在Linux上重现任何问题。这个“冻结”应该在什么时候发生?单击“打开”按钮或尝试关闭窗口后,对话框冻结。冻结将持续,直到循环在终端中打印10次。请描述一下您的环境。我正在arch linux上测试,。我怀疑区别在于你得到了一个本地gtk对话框,而我得到了一个kde对话框。尝试使用
DontUseNativeDialog
选项。或者尝试将
app.processEvents()
放在
getOpenFileNames
行之后。我刚刚在debian 8(kde 4)和OpenSuse(kde 5)上测试了代码:它可以工作,但在终端中显示非阻塞错误(startkdeinitlock(1816)KMimeTypeRepository::parents:“/usr/share/mime/subclass”指未知的mimetype”“application/vnd.ms-…)。另一方面,它像kubuntu 15.10上的charme一样工作,没有任何错误。很奇怪。。。
import time
import sys
from PyQt4 import QtGui
from PyQt4.QtCore import QThread

class process(QThread):
    def __init__(self, files):
        QThread.__init__(self)
        self.files = files

    def run(self):
        print(self.files)

        # simulates a long process
        for i in range(10):
            print(i)
            time.sleep(1)

app = QtGui.QApplication(sys.argv)
files = QtGui.QFileDialog.getOpenFileNames()

thread = process(files)
thread.start()
thread.wait()