PyQt5 QTimer в QThread собирает мусор?

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

Метод run() запускается кнопкой из класса Main_Window. Перенос экземпляра таймера в метод run() не помог. В чем проблема?

#Main_Window class is here

class TheThread(QThread):

    def __init__(self, Main_Window):
        QThread.__init__(self)

        #some code above
        self.timeTaken = 0
        self.myTimer = QTimer()
        self.myTimer.timeout.connect(self.track_time)

    def track_time(self):
        #Not being called
        self.timeTaken += 0.1

    def run(self):
        #some code above
        self.myTimer.start(1000)
        #code in a while loop below

if __name__ == "__main__":
    app = QApplication(sys.argv)
    main = Main_Window()
    sys.exit(app.exec_())

person Noon    schedule 18.01.2018    source источник


Ответы (1)


Хотя ответ @eyllanesc работает, метод run уже содержит цикл событий (если вы его не переопределите!). Таким образом, вы могли бы вместо этого сделать:

class TheThread(QtCore.QThread):
    def __init__(self, Main_Window):
        QtCore.QThread.__init__(self)
        #some code above
        self.timeTaken = 0
        self.myTimer = QtCore.QTimer()
        self.myTimer.moveToThread(self)
        self.myTimer.timeout.connect(self.track_time)
        # once the thread starts, the started signal is emitted
        self.started.connect(self.start_timer)
        # start the thread, which will emit the above signal!
        self.start()

    def start_timer(self):
        self.myTimer.start(1000)

    def track_time(self):
        self.timeTaken += 0.1
        print(self.timeTaken)
person three_pineapples    schedule 19.01.2018