Почему PyQt4 DialogBox OpenFileName зависает, пока другие потоки не закончатся в Linux
В Linux QFileDialog.getOpenFileNames() зависает в скрипте, у которого нет другого графического интерфейса, пока не выполнится другой процесс, даже если он выполняется в отдельном потоке или 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)
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()
1 ответ
Как предположил ехуморо, проблема родом из DialogBox под рабочим столом gtk.
Добавление "options=QtGui.QFileDialog.DontUseNativeDialog" в аргументы getOpenFileNames полностью решает проблему (без остановки или сообщения об ошибке).