Похоже, у вас простое условие гонки.
Когда я добавляю time.sleep(1)
между вызовами к self.threadTerminate.emit
и self.terminate
, программа завершается, как и ожидалось (за исключением вашего оператора печати, где strи bool не может быть объединен, естественно).
Не зная точных деталей того, как Qt обрабатывает поток сигналов / слотов, я бы сказал, что ваш вызов terminate
очищает поток и его сигналы до того, каквызов подключенного слота в потоке MainWindow
, тем самым стирая событие finished
из цикла событий и пропуская ваш вызов на Quit()
.
Короче: выполните self.exit()
вQ вместо этого.Это изящная альтернатива выключению terminate
, которую, насколько я видел, вам следует избегать, когда это возможно.
В качестве примечания, возможно, переосмыслите названия модулей и классов.Модуль thread
был модулем в Python2, переименован в _thread
в Python3.Это сначала смутило меня (так же, как и выше), так как у вас есть собственный модуль с именем "thread.py".Кроме того, MainWindow
напоминает название PyQt5.QtWidgets.QMainWindow
, тогда как QCoreApplication
не имеет «окон».