QThread виджет сбоя при подаче сигнала - PullRequest
0 голосов
/ 06 сентября 2018

Пытается выучить QThread. Я хочу, чтобы эта кнопка запускала таймер при запуске и через 5 секунд изменила текст на «остановлено».

если я запускаю это, через 5 секунд я получаю сообщение о сбое Python. Я сделал что-то не так?

является ли terminate () сопровождаемым run () приемлемым подходом? Кажется, это работает, потому что, если я продолжаю нажимать кнопки, приложение не будет зависать

import sys
import time
from PySide.QtGui import QPushButton, QApplication
from PySide.QtCore import SIGNAL, QThread


class testThread(QThread):
    def __init__(self):
        QThread.__init__(self)
        self.timeout = SIGNAL('timeout')
    def __del__(self):
        self.wait()
    def run(self):
        time.sleep(5)
        self.emit(self.timeout, 'from thread')


class testButton(QPushButton):
    def __init__(self):
        super(testButton, self).__init__()
        self.setText('Running...')
        self.timer = testThread()
        self.connect(self.timer, self.timer.timeout, self.timeout)
        self.clicked.connect(self.resetTimer)
        self.timer.start()

    def timeout(self):
        self.setText('Stopped')

    def resetTimer(self):
        self.timer.terminate()
        self.setText('Running...')
        self.timer.start()

if __name__=='__main__':
    app = QApplication(sys.argv)
    button = testButton()
    button.show()
    button.raise_()
    sys.exit(app.exec_())

Обновление - переключение СИГНАЛА на Сигнал работает. Любопытно почему. Вот что изменилось

testThread:

class testThread(QThread):
    timeout = Signal(str)
    def __init__(self):
        QThread.__init__(self)
    def __del__(self):
        self.wait()
    def run(self):
        time.sleep(5)
        self.timeout.emit('')

И проверка соединения сигнала Кнопка

self.timer.timeout.connect(self.timeout)
...