Python PyQt5:线程中的计时器
问题描述 我正在尝试制作一个应用程序,用于收集数据、处理数据、显示数据,以及一些驱动(打开/关闭阀门等)。作为未来应用程序的一种实践,我有一些更严格的时间限制,我希望在单独的线程中运行数据捕获和处理 我目前的问题是,它告诉我不能从另一个线程启动计时器 当前代码进度Python PyQt5:线程中的计时器,python,pyqt,pyqt5,qthread,qtimer,Python,Pyqt,Pyqt5,Qthread,Qtimer,问题描述 我正在尝试制作一个应用程序,用于收集数据、处理数据、显示数据,以及一些驱动(打开/关闭阀门等)。作为未来应用程序的一种实践,我有一些更严格的时间限制,我希望在单独的线程中运行数据捕获和处理 我目前的问题是,它告诉我不能从另一个线程启动计时器 当前代码进度 import sys import PyQt5 from PyQt5.QtWidgets import * from PyQt5.QtCore import QThread, pyqtSignal # This is our win
import sys
import PyQt5
from PyQt5.QtWidgets import *
from PyQt5.QtCore import QThread, pyqtSignal
# This is our window from QtCreator
import mainwindow_auto
#thread to capture the process data
class DataCaptureThread(QThread):
def collectProcessData():
print ("Collecting Process Data")
#declaring the timer
dataCollectionTimer = PyQt5.QtCore.QTimer()
dataCollectionTimer.timeout.connect(collectProcessData)
def __init__(self):
QThread.__init__(self)
def run(self):
self.dataCollectionTimer.start(1000);
class MainWindow(QMainWindow, mainwindow_auto.Ui_MainWindow):
def __init__(self):
super(self.__class__, self).__init__()
self.setupUi(self) # gets defined in the UI file
self.btnStart.clicked.connect(self.pressedStartBtn)
self.btnStop.clicked.connect(self.pressedStopBtn)
def pressedStartBtn(self):
self.lblAction.setText("STARTED")
self.dataCollectionThread = DataCaptureThread()
self.dataCollectionThread.start()
def pressedStopBtn(self):
self.lblAction.setText("STOPPED")
self.dataCollectionThread.terminate()
def main():
# a new app instance
app = QApplication(sys.argv)
form = MainWindow()
form.show()
sys.exit(app.exec_())
if __name__ == "__main__":
main()
任何关于如何让这项工作的建议将不胜感激 您必须将QTimer移动到DataCaptUratRead线程,此外,当run方法结束时,线程将被删除,因此计时器将被删除,因此您必须避免在不阻塞其他任务的情况下运行该函数。QEventLoop用于以下用途:
class DataCaptureThread(QThread):
def collectProcessData(self):
print ("Collecting Process Data")
def __init__(self, *args, **kwargs):
QThread.__init__(self, *args, **kwargs)
self.dataCollectionTimer = QTimer()
self.dataCollectionTimer.moveToThread(self)
self.dataCollectionTimer.timeout.connect(self.collectProcessData)
def run(self):
self.dataCollectionTimer.start(1000)
loop = QEventLoop()
loop.exec_()
非常感谢。这在编辑以下行后起作用:
self.dataCollectionTimer.timeout.connect(self.collectProcessData)
到self.dataCollectionTimer.timeout.connect(lambda:self.collectProcessData)
否则会出现错误:TypeError:collectProcessData()接受0个位置参数,但给出了1个
,我不太理解,因为没有提供任何参数passed@robotHamster如果它对您有效,请不要忘记将我的答案标记为正确。@ellyanesc如果我将lambda添加到您的答案中可以吗?将def collectProcessData()
更改为def collectProcessData(self)
更正:代码运行,但“收集过程数据”从未打印到控制台。在run
中启动计时器之后,我添加了一个print(“称为Start”)
,并在@ellyanesc处打印出来