我在Python3中使用PyQt。
我的QTimer
没有调用他们被告知要连接的功能。 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_())
答案 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_())