当前位置: 首页 > 编程日记 > 正文

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

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

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

相关文章:

linux secureCRT 显示中文乱码

安装的时候,只安装了英文,没有安装中文,所以只有en_US.UTF-8.因为linux本身就支持多语言,所以我们只需要在光盘 上找到2个中文支持字体包安装上即可.这两个字体文件是存放在第四张光盘上的Servers目录下: fonts-chines…

PicGo 配置Gitee 图床

目录 1.下载安装picGo 2.打开picGo详情页面 3.创建gitee图床库 ​4. 配置picGo 5.获取gitee token信息 6.与typora搭配使用 1.下载安装picGo 百度picgo csdn下载地址:https://download.csdn.net/download/huyande123/12582917 2.打开picGo详情页面 3.创建gitee图床库 …

文件夹内多文件上传到服务器

文件夹上传至服务器希望可以给你一点帮助 直接上代码jsp页面 <div style"text-align:center; vertical-align:middel" id"uploadFile"> <input type"file" name"file" id"file" multiple"multiple" webk…

【Socket研究】~。~ Scoket开发蛋疼笔记 Silverlight

客户端连接步骤【Silverlight】 【注意】 Silverlight 客户端 记得一定是异步连接。 一。连接步骤 1.实例一个Scoket 2.实例套接字 SocketAsyncEventArgs 3.给套接字载入连接信息 4.载入异步方法转载于:https://www.cnblogs.com/manbaal/archive/2011/03/08/1977521.html

通知:正式迁移至新博客

博客迁移这事情已经有一段时间了&#xff0c;不过最近发现似乎还有许多朋友不知道这点&#xff0c;以为我怎么不写博客了——其实我还在写&#xff0c;写的还挺勤快的&#xff0c;只不过已经不继续同步到博客园了。这事儿说来也很遗憾&#xff0c;原本我打算两边同步更新&#…

java中别名问题

Java中别名问题 Java中涉及到对象引用时常常出现意想不到得问题直接将一个对象赋值给另一个对象时 改变另一个对象 开始的那个对象也出现改变class Person{private int age;public int getAge() {return age;}public void setAge(int age) {this.age age;}} 对于对象Person做如…

中国挪动批改KPI查核制度将器重客户满意度

飞象网讯&#xff08;魏德龄/文&#xff09;记者从相关动静处置解到&#xff0c;中国挪动2011年的KPI查核将大幅缩减&#xff0c;并消除数据业务、TD用户数和集体客户等目标&#xff0c;重点调高了利润和客户满意度目标&#xff0c;并加入了相关EVA财务目标查核。去年&#xff…

ElasticSearch安装使用 操作索引

文章目录1.下载并安装2.了解es的配置文件**elasticsearch-.yml**&#xff08;中文配置详解&#xff09;3.使用head插件1.使用谷歌浏览器head插件2.使用压缩中的head程序4.使用kibana(安装)1.什么是kibana2.kibana国际化&#xff0c;将kibana设值成中文3.启动&#xff08;es先启…

36.两个链表的第一个公共结点——剑指offer

/* 找出2个链表的长度&#xff0c;然后让长的先走两个链表的长度差&#xff0c;然后再一起走 &#xff08;因为2个链表用公共的尾部&#xff09; */ class Solution { public:ListNode* FindFirstCommonNode( ListNode *pHead1, ListNode *pHead2) {int len1 findListLenth(pH…

浅析SAAS数据模型设计(Oracle)

目前SAAS平台对于大家来说并不陌生&#xff0c;市场上真正属于SAAS应用的并不是特别多&#xff0c;还有很大一部分是ASP的模式在运行&#xff0c;不管对于公司还是技术部门都是很大的挑战。去年在做elearning项目的时候其实也就是一个ASP的模式扩展&#xff0c;ASP模式本身就会…

编译原理(六)自底向上分析之LR分析法

自底向上分析之LR分析法 说明&#xff1a;以老师PPT为标准&#xff0c;借鉴部分教材内容&#xff0c;AlvinZH学习笔记。 基本概念 1. LR分析&#xff1a;从左到右扫描(L)自底向上进行规约(R)&#xff0c;是规范规约&#xff0c;也即最右推导&#xff08;规范推导&#xff09;&a…

一篇文章让你搞懂原型和原型链

每一个构造函数在被创建的时候&#xff0c;会自动创建一个相应的对象&#xff0c;这个对象就是原型对象&#xff0c;这个函数有一个指向该对象的指针。举个例子&#xff1a; 下面创建了一个函数person。 function person () { } 则 person.prototype 就是原型对象。而原型对象里…

elasticsearch 文档操作

文章目录single API1.添加数据2.更新数据PUTPOST --此方式更零活&#xff0c;可指定修改指定字段2.查询数据简单查询--根据id查询根据查询条件查询 --query string search根据查询条件查询--query DSL1.term/terms 过滤2.range过滤3.exists 和 missing 过滤4.bool过滤5.bool查询…

一起学WP7 XNA游戏开发(八. 让3d model动起来)

如何让3d model动起来&#xff0c;其实就是要给model的bone设置动作&#xff0c;这样整个model就会动起来了。一&#xff0e;获取Bones在fbx文件中可以看到所有bones的名称&#xff0c;这样就可以通过名称来获取到bones。turretBone tankModel.Bones["turret_geo"];…

【Python】解析Python中类的使用

目录结构&#xff1a; contents structure [-]类的基本使用专有方法继承单重继承多重继承砖石继承1.类的基本使用 下面是类使用的一个简单案例&#xff0c; class person:"person 类的描述信息"def __init__(self,name"",age0):self.name nameself.age a…

hive中array嵌套map以及行转列的使用

1. 数据源信息 {"student": {"name":"king","age":11,"sex":"M"},"sub_score":[{"subject":"语文","score":80},{"subject":"数学","score&qu…

SpringBoot 操作elasticsearch

SpringBoot 操作elasticsearch 版本环境 jdk1.8elasticsearch 7.6.1 maven <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId></dependency>注意版本&#xf…

替换WCF默认序列化方式

创建类 : using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.ServiceModel.Description; using System.Xml; using System.Runtime.Serialization; namespace Kingge.Mini.Network { public class NetDataContra…

Linux下vi编辑器命令精华版

最近开始使用vi编辑器&#xff0c;用了几天&#xff0c;发现其实还是比较好用的。对自己常用的命令做个总结&#xff0c;以备实时查阅。一下内容是对网络多篇文章的总结。进入vi的命令&#xff1a;vi filename :打开或新建文件&#xff0c;并将光标置于第一行首 vi filename &…

测试用例评审关注点

测试用例评审关注点 1、用例设计是否清晰、合理、简洁&#xff1b; 2、用例是否高效对需求进行覆盖&#xff0c;是否覆盖测试需求上的所有功能点&#xff1b; 3、优先级是否合理&#xff1b; 4、用例是否有很好的可执行性&#xff08;例如用例的“执行步骤”、“期待结果”是否…

命令行收集(DOS/Linux/nc/xscan/xsniffer)

#1 一&#xff1a; net use \\ip\ipc$ " " /user:" " 建立IPC空链接 net use \\ip\ipc$ "密码" /user:"用户名" 建立IPC非空链接 net use h: \\ip\c$ "密码" /user:"用户名" 直接登陆后映射对方C&#xff1a;到…

偏前端 - vue-cli(axios请求数据==》token+按接口参数顺序(参数值拼接base64)- MD5)...

token按接口参数顺序&#xff08;参数值拼接base64&#xff09;-> MD5) 请教于“喵咪”&#xff0c;再此特别鸣谢&#xff01;~ 特别强调&#xff1a;import qs from qs; 这个内部方法一定要用哦。参数签名base64md5都成功的情况华。接口还是爆500&#xff0c;就是和这个有关…

Docker 搭建elasticsearch 7.6.x集群

Docker 搭建elasticsearch 7.6.x集群 文章目录拉取镜像设置Elasticsearch挂载目录编写elasticsearch.yml配置文件node-1node-2node-3创建镜像验证是否搭建成功问题max virtual memory areas vm.max_map_count [65530] is too low, increase to at least参考拉取镜像 docker pu…

乐嘉性格色彩分析测试题

乐嘉<性格色彩>分析测试题 说明&#xff1a;最符合你的句子用红色作标记 1. 关于人生观&#xff0c;我的内心其实是&#xff1a; A 希望能够有尽量多的人生体验&#xff0c;所以会有非常多样化的想法。 B在小心合理的基础上&#xff0c;谨慎地确定自己的目标&#xff…

OAuth_1

OAuth2.0是一个应用之间彼此访问数据的开源授权协议。比如&#xff0c;一个游戏应用可以 访问Facebook的用户数据。用户访问web游戏应用&#xff0c;该游戏应用要求用户通过Facebook 登录。用户登录到Facebook&#xff0c;再重定向回游戏应用&#xff0c;游戏应用就可以访问用户…

ubuntu 使用阿里云 apt 源

以下内容来自 https://opsx.alibaba.com/mirror Ubuntu对应的“帮助”信息 修改方式&#xff1a;打开 /et/apt/sources.list将http://archive.ubuntu.com/替换为mirrors.aliyun.com即可 PS&#xff1a;网络上的信息&#xff0c;一定得注意时效性。以下内容&#xff0c;均为此时…

ecos 编译时无法找到 tclConfig.sh 和 tkConfig.sh

这是因为 tcl-devel tk-devel 一般系统中默认是不安装的&#xff0c;至少cent-os 5.5 和fedora 11是这样的&#xff0c;安装这两个包即可。 # yum install tcl-devel tk-devel 补记&#xff1a; ubuntu 10.04.2 上为了便于多个版本的tcl的存在&#xff0c;tcl被安装的位置不太一…

从消息处理角度看应用程序与windows的关系(图示)

转载于:https://blog.51cto.com/gzkhrh/338533

002:用Python设计第一个游戏

笔记 什么是BIF&#xff1f; 答&#xff1a;BIF 即 Built-in Functions&#xff0c;内置函数。为了方便快速编写脚本程序&#xff0c;Python 提供了非常丰富的内置函数&#xff0c;我们只需要直接调用即可&#xff0c;例如 print() 的功能是“打印到屏幕”&#xff0c;input() …

哑谜,回文和暴力之美

暴力搜索是一个有趣的东西。至少刘汝佳是这么认为的。编程之美的4.10节就是典型的暴力题。虽然作者将其难度定义为一颗星&#xff0c;但却不能因此认为这个类型的问题就是那么容易的&#xff0c;很多可能需要一些有创造力的想法。 不妨试试下面这几道题&#xff1a; Island of …