gpt4 book ai didi

python - pyqt5计时器事件在qthread中不起作用?

转载 作者:行者123 更新时间:2023-12-01 00:43:53 26 4
gpt4 key购买 nike

我需要在线程中计算一个数字,然后处理数据,但线程中的计时器不工作。

from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import Qt, QObject, QThread, pyqtSlot, QTimer
import sys, time

class Worker(QObject):
def __init__(self):
super().__init__()

self.i = 0
self.startTimer(100)

def timerEvent(self, QTimerEvent):
self.i += 2

@pyqtSlot()
def run(self):
while True:
print(self.i)
time.sleep(1)

class Demo(QWidget):
def __init__(self):
super().__init__()
self.worker = Worker()
self.thread = QThread()
self.worker.moveToThread(self.thread)
self.thread.started.connect(self.worker.run)
self.thread.start()

app = QApplication(sys.argv)
demo = Demo()
demo.show()
app.exec()

终端总是显示0,谁能帮助我。

最佳答案

信号和事件需要事件循环才能工作。当您使用 QThread 时,您会创建该事件循环,但是当使用 time.sleep() 时,您会阻止它,从而阻止 timerEvent() 方法被执行调用。因此,解决方案是将 time.sleep() 替换为另一个不阻止它的选项(QEventLoop + QTimer)。

from PyQt5 import QtCore, QtWidgets


class Worker(QtCore.QObject):
def __init__(self):
super().__init__()

self.i = 0
self.m_id = self.startTimer(100)

def timerEvent(self, event):
if self.m_id == event.timerId():
self.i += 2
super().timerEvent(event)

@QtCore.pyqtSlot()
def run(self):
while True:
print(self.i)
loop = QtCore.QEventLoop()
QtCore.QTimer.singleShot(1000, loop.quit)
loop.exec()


class Demo(QtWidgets.QWidget):
def __init__(self, parent=None):
super().__init__(parent)
thread = QtCore.QThread(self)
self.worker = Worker()
self.worker.moveToThread(thread)
thread.started.connect(self.worker.run)
thread.start()


if __name__ == "__main__":
import sys

app = QtWidgets.QApplication(sys.argv)
demo = Demo()
demo.show()
sys.exit(app.exec())

关于python - pyqt5计时器事件在qthread中不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57143372/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com