是否可以通过Python控制台而不是GUI应用程序在QObjects中使用QTimers?

时间:2019-06-07 09:32:36

标签: python pyqt pyqt5

我已经创建了用于控制测量的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个文件)。

1 个答案:

答案 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()