1

我正在将 PyQt 与 Python3 一起使用。

QTimer的 s 没有调用他们被告知要连接的函数。isActive()正在返回True,并且interval()工作正常。下面的代码(独立工作)演示了问题:线程已成功启动,但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_())
4

1 回答 1

6

thread_func从线程的run方法中调用,这意味着您在该函数中创建的计时器位于该线程的事件循环中。要启动线程事件循环,您必须从它的运行方法exec_()中调用它的方法,而不是从主线程。在您的示例中,永远不会被执行。要使其工作,只需将调用移动到线程的.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_())
于 2013-07-11T00:48:23.083 回答