我创建了一个单独的附加线程并尝试在其中运行,QTimer以便每秒调用一次应该在同一线程中运行的函数。
但这并没有发生,计时器只是不起作用。
有什么问题吗?
import sys
from time import sleep
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton, QMainWindow
from PyQt5.QtCore import QThread, QObject, QTimer
class Worker(QObject):
def __init__(self):
super().__init__()
def print_2(self):
print(2)
def run(self):
self.timer = QTimer()
self.timer.timeout.connect(self.print_2)
self.timer.start(1000)
while True:
print(1)
sleep(1)
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.central_widget = QWidget(self)
self.setCentralWidget(self.central_widget)
self.layout_window = QVBoxLayout()
self.central_widget.setLayout(self.layout_window)
self.btn = QPushButton('Запустить поток')
self.btn.clicked.connect(self.start_thread)
self.layout_window.addWidget(self.btn)
def start_thread(self):
self.main_thread = QThread(parent=self)
self.worker = Worker()
self.worker.moveToThread(self.main_thread)
self.main_thread.started.connect(self.worker.run)
self.main_thread.start()
app = QApplication(sys.argv)
app.setStyle('Fusion')
main_window = MainWindow()
main_window.show()
sys.exit(app.exec_())
我不明白为什么需要在单独的线程中运行
QTimer?我不知道您想每秒定期运行一次的任务是什么?
QTimer是一个继承于父类QObject并QObject属于同一父类的类,如果没有父类,则属于创建它的线程。另一方面,
QThread — это поток Qt, но это не такQThread是一个允许您处理自己线程的生命周期的类,这在文档中有明确说明:QThread 类提供了一种独立于平台的方式来管理线程。
还要注意处理 QThread 的新线程只有在方法位于相对于创建它的字段的其他地方时才
具有方法的作用域
run()QThread。QTimer- 仅适用于创建它的线程。尝试分析你的代码(
threading.get_ident())哪个方法在哪个线程中执行。你会看到方法
run()和方法print_2()在不同的线程上运行。这就是为什么计时器不起作用的原因。
鉴于我不太明白我上面写的内容,只是为了演示该方法的范围
run():