2015-04-28 2 views
2

У меня есть следующая проблема:PyQt GUI порядок операций

при нажатии кнопки в PyQt из GUI я должен сделать два действия:

  1. Немедленно обновить QTextBrowser
  2. Выполнить метод, будет ждать некоторое время и включить некоторые кнопки после.

То, что я получаю, это то, что 1 и 2 выполняются одновременно, после периода ожидания.

Часть кода:

#in the signals definition... 
    signalUpdateProgressDialog = QtCore.pyqtSignal(str) # signal definition 

    #in the connections definition... 
    self.btnStopOpt.clicked.connect(self.clickStop1) 
    self.btnStopOpt.clicked.connect(self.clickStop) 

def updateProgressDialog(self, dialog): 
    self.ProgressDialog.setHtml(dialog) 

def clickStop1(self): 
    # notify 
    self.signalUpdateProgressDialog.emit('Message') 

def clickStop(self): 

    # shut down thread... 

    print "Thread Stopped" 

    time.sleep(5) 
    # enable run button 
    self.btnRun.setEnabled(True) 

Я попробовал все в одном методе со щелчком, я попытался с и без сигнала для непосредственно излучающих UpdateProgress. Всегда, GUI обновляется только после периода ожидания.

Тем не менее, я столкнулся с этой проблемой раньше, я думаю, что не понимаю, как это работает с графическим интерфейсом. В общем, как получить требуемое поведение: графический интерфейс обновляется при выполнении строки кода?

ответ

5

GUI не обновляется/нарисован до тех пор, пока управление не будет возвращено в цикл событий Qt. Цикл событий запускается в основном потоке, и это то, что обрабатывает взаимодействия с графическим интерфейсом и координирует систему сигналов/слотов.

Когда вы вызываете функцию Qt в слоте, например clickStop1(), вызов Qt выполняется, но графический интерфейс не перерисовывается немедленно. В этом случае управление не возвращается в цикл обработки событий до clickStop() завершения выполнения (иначе все слоты для clicked сигнала обрабатываются.

Основная проблема с вашим кодом является то, что у вас есть time.sleep(5) в главном потоке , который блокирует взаимодействие с графическим интерфейсом для пользователя, а также переоформление. вы должны держать время выполнения прорезей коротких поддерживать отзывчивый GUI.

Я бы, таким образом, предлагает вам изменить clicked() так, что он запускает singleshot QTimer после вашего указания тайм-аут QTimer s не блокирует основной поток, и поэтому реакция будет сохранена. Однако имейте в виду, что пользователь может взаимодействовать с графическим интерфейсом в среднее время! Убедитесь, что они не могут скомпрометировать состояние вашей программы при некотором взаимодействии с пользователем, пока вы ждете выполнения QTimer.

+0

Спасибо за объяснение. – Stjepan

Смежные вопросы