热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

pyqt5使用QTimer,QThread,pyqtSignal实现自动执行,多线程,自定义信号触发。

渣渣用法,请等待我心情好的时候更新。1.第一个例子1.1先看mainwindow.pyfromPyQt5importQtCore,QtGui,QtWidgetscla

渣渣用法,请等待我心情好的时候更新。

 

 

1.第一个例子

1.1 先看mainwindow.py

from PyQt5 import QtCore, QtGui, QtWidgetsclass Ui_MainWindow(object):def setupUi(self, MainWindow):MainWindow.setObjectName("MainWindow")MainWindow.resize(640, 320)self.centralwidget = QtWidgets.QWidget(MainWindow)self.centralwidget.setObjectName("centralwidget")self.textBrowser = QtWidgets.QTextBrowser(self.centralwidget)self.textBrowser.setGeometry(QtCore.QRect(0, 0, 320, 320))self.textBrowser.setObjectName("textBrowser")self.pushButton = QtWidgets.QPushButton(self.centralwidget)self.pushButton.setGeometry(QtCore.QRect(450, 150, 75, 23))self.pushButton.setObjectName("pushButton")MainWindow.setCentralWidget(self.centralwidget)self.retranslateUi(MainWindow)self.pushButton.clicked.connect(MainWindow.start)QtCore.QMetaObject.connectSlotsByName(MainWindow)def retranslateUi(self, MainWindow):_translate = QtCore.QCoreApplication.translateMainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))self.pushButton.setText(_translate("MainWindow", "开始"))

定义了一个窗口UI_MainWindow,有一个textBrowser,有一个pushButton

pushButton点击连接到MainWindow.start

1.2 看main.py

import sys, time
from PyQt5 import QtWidgets
from PyQt5.QtCore import QTimer, QThread, pyqtSignal
from mainwindow import Ui_MainWindowclass MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):def __init__(self, parent=None):super(MainWindow, self).__init__(parent=parent)self.setupUi(self)def start(self):time.sleep(2)self.textBrowser.append('test1')if __name__ == "__main__":app = QtWidgets.QApplication(sys.argv)w = MainWindow()w.show()sys.exit(app.exec_())

简单的继承UI_MainWindow,并且定义了MainWindow.start,延迟两秒给textBrowser写进test

2.引入QTimer

QTimer是一个定时任务,可以在指定的时间运行制定的函数,电子钟示例都用的它。

我要用它来实现窗口加载完毕后就自动执行的任务,一般是程序的自检任务。

2.1看main.py

import sys, time
from PyQt5 import QtWidgets
from PyQt5.QtCore import QTimer, QThread, pyqtSignal
from mainwindow import Ui_MainWindowclass MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):def __init__(self, parent=None):super(MainWindow, self).__init__(parent=parent)self.setupUi(self)# 初始化一个定时器self.timer = QTimer(self)# 定义时间超时连接start_app
self.timer.timeout.connect(self.start)# 定义时间任务是一次性任务
self.timer.setSingleShot(True)# 启动时间任务
self.timer.start()def start(self):time.sleep(2)self.textBrowser.append('test1')if __name__ == "__main__":app = QtWidgets.QApplication(sys.argv)w = MainWindow()w.show()sys.exit(app.exec_())

增加的4行就能实现启动即执行。

但是问题是,都执行完MainWindow.start,窗体才显现出来。这个体验可是真差了。

3.引入QThread

QThread是一个多线程调度器,和python的threading性质一样,看名字都像。

3.1 看main.py

import sys, time
from PyQt5 import QtWidgets
from PyQt5.QtCore import QTimer, QThread, pyqtSignal
from mainwindow import Ui_MainWindowclass MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):def __init__(self, parent=None):super(MainWindow, self).__init__(parent=parent)self.setupUi(self)# 初始化一个定时器self.timer = QTimer(self)# 定义时间超时连接start_app
self.timer.timeout.connect(self.start)# 定义时间任务是一次性任务
self.timer.setSingleShot(True)# 启动时间任务
self.timer.start()# 实例化一个线程self.work = WorkThread()# 多线程的信号触发连接到UpText
self.work.trigger.connect(self.UpText)def start(self):# time.sleep(2)# self.textBrowser.append('test1')# 启动另一个线程
self.work.start()def UpText(self, str):time.sleep(2)self.textBrowser.append('test2')class WorkThread(QThread):# 定义一个信号trigger = pyqtSignal(str)def __int__(self):# 初始化函数,默认super(WorkThread, self).__init__()def run(self):time.sleep(5)# 等待5秒后,给触发信号,并传递testself.trigger.emit('test2')if __name__ == "__main__":app = QtWidgets.QApplication(sys.argv)w = MainWindow()w.show()sys.exit(app.exec_())

3.2讲解一下对这个程序的理解:

窗口启动后,用QTimer启动一个一次性任务MainWindow.start

MainWindow.start,则是通过QThread启动另一个线程   WrokThread.run

WrokThread.run触发一个信号WrokThread.tragger,并传入字符串‘test2’

MainWindow中的work是实例化的WrokThread

work.trigger连接到MainWindow.UpText

执行了MainWindow.UpText,就更新了textBrowser

由于是多线程执行,一个线程再展示GUI窗口,另一个线程在执行WrokThread.run,所以GUI窗口无卡顿了。

 


转载于:https://www.cnblogs.com/jackadam/p/8302442.html


推荐阅读
author-avatar
温暖不醒的aprildRi-1965
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有