Проблема заключается в том, что это локальная переменная, которая будет уничтожена через мгновение после запуска QThread
, поэтому поток, который обрабатывается QThread
(QThread не является потоком, это потокобработчик) будет удален, и при использовании wait()
ожидается, что метод run()
будет выполнен, но в основном потоке, генерирующем зависание графического интерфейса.
Таким образом, решение состоит в том, чтобы продлить срок жизни переменнойПоток, один из способов указать, что он работает: сделать его членом класса, но есть другой способ, который работает только с QObjects как QThread и заключается в передаче родителя (родитель должен быть другим QObject), который будет расширятьсясрок службы объекта до той же емкости, что и у родителя, поэтому я буду использовать диалоговое окно.
Наконец, в настоящее время не рекомендуется создавать сигналы динамически, лучше создавать его как часть классаТакже для соединения необходимо использовать новый синтаксис .
class UI():
def __init__(self):
self.app = QtGui.QApplication(sys.argv)
self.dialog = QtGui.QDialog()
self.ui = Ui_Dialog()
self.ui.setupUi(self.dialog)
self.ui.btn.clicked.connect(self.btnclick)
self.dialog.show()
def btnclick(self):
thread = testThread(self.dialog)
thread.signal.connect(self.output)
thread.start()
def output(self, txt):
self.ui.logText.append(str(txt))
class testThread(QtCore.QThread):
signal = QtCore.pyqtSignal(str)
def __del__(self):
self.wait()
def run(self):
for i in range(10):
QtCore.QThread.sleep(1)
self.output(str(i))
def output(self, txt):
self.signal.emit(txt)
if __name__ == '__main__':
ui = UI()
app = QtGui.QApplication.instance()
if app is not None:
sys.exit(app.exec_())