QT计时器没有调用功能

时间:2013-07-10 22:21:12

标签: python multithreading qt python-3.x pyqt5

我在Python3中使用PyQt。

我的QTimer没有调用他们被告知要连接的功能。 isActive()正在返回Trueinterval()正常运行。下面的代码(单独工作)演示了问题:线程已成功启动,但永远不会调用timer_func()函数。大多数代码都是样板PyQT。据我所知,我正在按照文档使用它。它在一个带有事件循环的线程中。有什么想法吗?

import sys
from PyQt5 import QtCore, QtWidgets

class Thread(QtCore.QThread):
    def __init__(self):
        QtCore.QThread.__init__(self)

    def run(self):
        thread_func()


def thread_func():
    print("Thread works")
    timer = QtCore.QTimer()
    timer.timeout.connect(timer_func)
    timer.start(1000)
    print(timer.remainingTime())
    print(timer.isActive())

def timer_func():
    print("Timer works")

app = QtWidgets.QApplication(sys.argv)
thread_instance = Thread()
thread_instance.start()
thread_instance.exec_()
sys.exit(app.exec_())

1 个答案:

答案 0 :(得分:6)

您正在使用线程的thread_func方法调用run,这意味着您在该函数中创建的计时器将存在于该线程的事件循环中。要启动线程事件循环,必须调用它的exec_()方法from within it's run method,而不是主thrad。在您的示例中,app.exec_()永远不会被执行。要使其有效,只需将exec_调用移至帖子的run

另一个问题是,当thread_func完成时,你的计时器会被销毁。为了让它保持活力,你必须在某处保留一个参考。

import sys
from PyQt5 import QtCore, QtWidgets

class Thread(QtCore.QThread):
    def __init__(self):
        QtCore.QThread.__init__(self)

    def run(self):
        thread_func()
        self.exec_()

timers = []

def thread_func():
    print("Thread works")
    timer = QtCore.QTimer()
    timer.timeout.connect(timer_func)
    timer.start(1000)
    print(timer.remainingTime())
    print(timer.isActive())
    timers.append(timer)

def timer_func():
    print("Timer works")

app = QtWidgets.QApplication(sys.argv)
thread_instance = Thread()
thread_instance.start()
sys.exit(app.exec_())