pyqt5 使用 QTimer, QThread, pyqtSignal 实现自动执行,多线程,自定义信号触发。
渣渣用法,请等待我心情好的时候更新。
1.第一个例子
1.1 先看mainwindow.py
from PyQt5 import QtCore, QtGui, QtWidgets class 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.translate
MainWindow.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_MainWindow class 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_MainWindow class 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_MainWindow class 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秒后,给触发信号,并传递test
self.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窗口无卡顿了。
pyqt5 使用 QTimer, QThread, pyqtSignal 实现自动执行,多线程,自定义信号触发。的更多相关文章
- 使用自定义脚本扩展程序自动执行 VM 自定义任务
在 Build 开发者大会上推出VM 扩展程序的其中一个称为"自定义脚本扩展程序",它支持 PowerShell.如果这是您第一次访问这些博客,可能需要查看以前的博客,请单击 ...
- PyQt学习随笔:自定义信号连接时报AttributeError: 'PyQt5.QtCore.pyqtSignal' object has no attribute 'connect'
专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 如果使用自定义信号,一定要记得信号是类变量,必须在类中定义,不能在实例 ...
- WPF:自动执行"机器人"程序若干注意事项
企业应用中,经常会遇到一些需要定时自动执行的程序来完成某些功能,比如:自动定时从第三方web service取回数据.定时对历史数据进行清理.定时向ftp上传业务数据... 这类程序,我习惯称为“机器 ...
- 使用php作linux自动执行脚本
使用php作linux自动执行脚本 [来源] 达内 [编辑] 达内 [时间]2013-03-21 在作社区时, 时常需要统计上线人数等数据. 一般做法是, 把这段代码放在用户 login或者 ...
- (转)在网页中JS函数自动执行常用三种方法
原文:http://blog.sina.com.cn/s/blog_6f6b4c3c0100nxx8.html 在网页中JS函数自动执行常用三种方法 在网页中JS函数自动执行常用三种方法 在HTML中 ...
- jQuery在HTML文档加载完毕后自动执行某个事件;
原来onchange=“fucntionname(parms)”: <select name="country" id="selCountries_{$sn}&qu ...
- linux系统自动执行任务(转)
开机启动 开机启动应该是我们很经常的需求了,我们常需要在开机时就自动执行某些命令来开启服务,进程等,有了它我们不必再在每次开机时输入同一堆命令. chkconfig命令 使用chkconfig命令可以 ...
- JS函数自动执行
关于让网页中的JavaScript函数自动执行,方法就多洛,但是万变不离其宗,下面给大家介绍一下! 前提条件,网页中必须有JS函数代码,或者,使用文件导入的方法也行: 在HTML中的Head区域中,有 ...
- Oracle自动执行任务(存储过程)
Oracle自动执行任务(存储过程) SQL> variable job number;SQL> begin2 dbms_job.submit(:job,'存储过程名;',sysdate, ...
随机推荐
- vim常用的配置
.vimrc配置 syntax enable syntax on set relativenumber set autoindent set tabstop=4 set expandtab " ...
- 主引导记录MBR的结构和作用
MBR磁盘分区都有一个引导扇区,称为主引导记录,英文简称为MBR.1. MBR的结构MBR扇区位于整个硬盘的第一个扇区:按照C/H/S地址描述,即0柱面〇磁头1扇 区:按照LBA地址描述即0扇区.它是 ...
- P3938 斐波那契
思路 脑子还真的是好东西,自己太笨了 容易发现父亲节点和儿子节点的关系 儿子节点大于父亲节点 儿子节点和父亲节点之差为斐波那契数,且斐波那契数为小于儿子节点的最大的一个 1e12中有60左右的斐波那契 ...
- sql:临时表和表变量
在SQL Server的性能调优中,有一个不可比拟的问题:那就是如何在一段需要长时间的代码或被频繁调用的代码中处理临时数据集,表变量和临时表是两种选择. 临时表: 临时对象都以#或##为前缀,临时表是 ...
- 遍历GroupBox上的所有的textbox
foreach (Control c in groupBox1.Controls) { if (c is TextBox) { //这里写代码逻辑 } } 遍历的时候,需要用Control遍历: 如果 ...
- hibernate与mybatis的区别和应用场景
mybatis 与 hibernate 的区别和应用场景(转) 1 Hibernate : 标准的ORM(对象关系映射) 框架: 不要用写sql, sql 自动语句生成: 使用Hibernate ...
- 【TCP/IP详解 卷一:协议】第十八章 TCP连接 的建立与终止 (2)其余内容
18.5 TCP的半关闭 牢记 TCP 是 全双工 的. 半关闭:TCP提供了连接的一端 在结束了它的发送后 还能接收来自另外一端数据的能力.但是只有很少的应用程序利用它. 为了实现这个特性,编程接口 ...
- MVC 中Simditor上传本地图片
1.引用样式和js文件 <link href="~/Content/scripts/plugins/simditor/css/simditor.css" rel=" ...
- Goroutines和Channels(一)
Go语言中的并发程序可以用两种手段来实现.本章讲解goroutine和channel,其支持“顺序通信进程”(communicating sequential processes)或被简称为CSP.C ...
- pandas时间序列分析和处理Timeseries
pandas最基本的时间序列类型就是以时间戳(TimeStamp)为index元素的Series类型. 生成日期范围: pd.date_range()可用于生成指定长度的DatetimeIndex.参 ...