QThread
это не поток, это обработчик потока.В вашем случае проблема в том, что переменная t является локальной, поэтому она будет удалена после выполнения запуска, в этот момент вызывается метод __del__
, и это вызывает wait()
, который выполняется в главном потоке, блокирующем графический интерфейс, этоблокировка Это будет происходить до тех пор, пока метод run не завершит выполнение, поэтому в заключение проблема заключается в том, что t является локальной переменной, решение состоит в том, чтобы сохранить ее во времени, так что есть две возможности: 1) передать ее в self
в качестве родителя или2) сделать его членом класса:
class ProgramThread(QThread):
def run(self):
QThread.sleep(10)
def __del__(self):
self.wait()
class App(QWidget):
def __init__(self):
super().__init__()
thread = QPushButton('Start Thread',self)
thread.clicked.connect(self.startthread)
thread.move(20,100)
self.show()
def startthread(self):
# method 1
t = ProgramThread(self)
t.start()
# method 2
# self.t = ProgramThread()
# self.t.start()