我已经创建了用于控制测量的GUI应用程序。我将其拆分为模块,其中一些模块我希望在没有GUI的情况下仅从控制台使用。但是我出现了一个问题,当我在python控制台中导入模块并想运行测试时,此错误会打印到控制台:
QObject::startTimer: Timers can only be used with threads started with QThread
在这种情况下,除了main之外没有其他线程,所以我不知道是什么引起了问题。 我使用anaconda提示符启动python。
我的python版本是3.7.1。我进入放置该test1.py文件的文件夹,运行python,然后导入模块等
当我运行完整的应用程序时,工作程序类应正常工作(通常它在不同的线程中工作,我使用moveToThread函数)。 我想做的是:
open python console
import test1
work = test_module.Worker()
work.run()
当我键入“ python test1.py”并按下按钮时,来自worker的主循环运行良好。但是当我尝试仅运行上述工人时 它抛出QObject :: startTimer错误
我创建了一个非常简单的应用程序:
# test1.py
import sys
from PyQt5.QtCore import QObject, QTimer, QThread, pyqtSlot, pyqtSignal
from PyQt5.QtWidgets import QMainWindow, QPushButton, QApplication
class Worker(QObject):
start = pyqtSignal()
def __init__(self, plotter=None, mailer=None):
super(Worker, self).__init__()
self.started = False
self.start.connect(self.run)
self.measurement_delay = 1
@pyqtSlot()
def run(self):
if not self.started:
self.started = True
self.timer = QTimer(self)
self.timer.timeout.connect(self.main_loop)
self.timer.start(self.measurement_delay * 1000)
def main_loop(self):
print("test")
class MyApp(QMainWindow):
worker = Worker()
def __init__(self):
super(MyApp, self).__init__()
self.button = QPushButton('test')
self.setCentralWidget(self.button)
self.button.clicked.connect(self.start_worker)
def start_worker(self):
self.thread = QThread()
self.thread.start()
self.worker.moveToThread(self.thread)
self.worker.start.emit()
def main():
app = QApplication(sys.argv)
window = MyApp()
window.show()
sys.exit(app.exec_())
if __name__ == "__main__":
main()
我尝试通过信号或直接通过w.run()启动主循环,使用和不使用pyqtSlot()装饰器,QTimer(self)和QTimer(),但没有任何效果
有没有解决方法,如何使用使用QTimers和QObjects的单个模块?或者,我需要创建不使用QTimer的副本(但是那样进行更改非常不方便,因为我必须更改2个文件)。
答案 0 :(得分:0)
好的,我已经弄清楚了。您需要先创建QCoreApplication()才能运行Qt事件循环。
# start python console
import sys
import test1
from PyQt5.QtCore import QCoreApplication
app = QCoreApplication(sys.argv)
w = test1.Worker()
w.run()
>>> test
>>> test
>>> test
w.timer.stop()