2016-03-10 4 views
1

Под Linux, в QFileDialog.getOpenFileNames() замерзают в сценарии, которые не имеют никакого другого GUI, пока другой процесс не делал, даже если он работает в отдельном потоке или QThread.Почему PyQt4 DialogBox OPENFILENAME замерзнуть, пока другие потоки не закончат под Linux

Я испытан под 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, без замерзания! (питон-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() 
+0

Невозможно воспроизвести какие-либо проблемы в Linux. Точно, когда это «замораживание» должно произойти? – ekhumoro

+0

DialogBox замерзает после нажатия кнопки открытия или попытки закрыть окно. Замораживание сохраняется до тех пор, пока контур не напечатает 10 раз в терминале. Пожалуйста, опишите свою окружающую среду. – astacus

+0

Я тестирую на arch-linux. Я подозреваю, что разница в том, что вы получаете собственный диалог gtk, тогда как я получаю kde one. Попробуйте использовать опцию 'DontUseNativeDialog'. Или попробуйте поместить 'app.processEvents()' после строки 'getOpenFileNames'. – ekhumoro

ответ

1

Как предложил ekhumoro, проблема родом из родной DialogBox под рабочий стол GTK.

Добавить "options = QtGui.QFileDialog.DontUseNativeDialog" в аргументы getOpenFileNames полностью устраняет проблему (без зависания или сообщения об ошибке).