首页 > 其他分享 >入门 PyQt6 看过来(基础)23~ 定时器和线程

入门 PyQt6 看过来(基础)23~ 定时器和线程

时间:2024-08-04 16:53:59浏览次数:17  
标签:__ 定时器 23 self PyQt6 线程 def QThread

一般情况下,应用程序都是单线程运行的,但如果需要执行一个特别耗时的操作,GUI界面其他操作就无法进行,用户感觉程序没有了响应,或者windows系统也认为程序运行出现了问题并自动关闭了程序。有类似的情况应用就需要采用定时器和线程。

1 定时器(QTimer)

如果要在应用程序中周期性地运行某项操作,则可以使用QTimer定时器。

其常用的方法如下:

方法描述
start(n)启动或重启定时器,时间间隔为n毫秒。如果定时器已经允许,它将被停止并重新启动。如果singleShot信号为真,定时器仅被激活一次
stop()停止定时器

QTimer类常用的信号

信号描述
singleShot在给定的时间间隔后调用一个槽函数时发送次信号
timeout当定时器超时时发出此信号

要使用定时器,首先引入QTimer模块,创建一个QTimer实例,将其timeout信号连接到相应的槽函数,调用start(毫秒数)设定时间间隔后启动定时器,定时器会以指定的间隔发出timeout信号,执行槽函数。

# -*- coding:utf-8 -*-
"""
------------------------------------------------
File Name: 定时器.py
Description:
Author: lzq
date:2024-08-04 11:08
------------------------------------------------
"""
import sys

from PyQt6.QtCore import QTimer, QDateTime
from PyQt6.QtWidgets import QApplication, QWidget, QLabel


class MyWidget(QWidget):
    def __init__(self, parent=None):
        super(MyWidget, self).__init__(parent)
        self.setWindowTitle("定时器QTimer测试")
        self.resize(330,120)
        self.label=QLabel('',self)
        self.label.setGeometry(20,20,180,60)
        self.timer=QTimer(self)
        self.timer.timeout.connect(self.showTime)
        self.timer.start(1000)
    def showTime(self):
        time=QDateTime.currentDateTime()
        timeDisplay=time.toString("yyyy-MM-dd hh:mm:ss dddd")
        self.label.setText(timeDisplay)


if __name__=='__main__':
    app = QApplication(sys.argv)
    w = MyWidget()
    w.show()
    sys.exit(app.exec())

2 线程(QThread)

QThread时PyQt6线程类中最核心的底层类

(1)要使用QThread开始一个线程,可以创建它的一个子类(集成QThread),重载QThread.run方法。

class Thread(QThread):
	def __init__(self):
 		super(Thread,self).__init__()
	def run(self):
		#线程代码
		pass

(2)然后创建一个新的线程,启动线程:

thread=Thread()
thread.start()

线程启动后会自动调用其实现run方法,线程任务(例如读取数据显示在界面中)就写在run方法中,当run方法退出之后线程基本就结束了。

QThread类中的常用方法如下:

方法描述
start()启动线程
wait(n)阻止线程
sleep(n)强制当前线程睡眠n秒
msleep(n)当前线程睡眠n毫秒
quit()退出线程事件并返回0(成功),相当于exit():0。
exit()退出线程事件循环并返回代码。返回0表示成功,非0表示错误
terminate()强制终止线程
setPriority(枚举)设置线程优先级
isFnished()线程是否完成
isRunning()线程是否正在运行

QThread常用的信号如下:

started:在开始执行run之前,从相关线程发送此信号。

finished:当程序完成业务逻辑时,从相关线程发送此信号。

可为这两个信号指定槽函数,在线程启动和结束时进行资源的初始化和释放操作。或者在自定义的QThread实例中自定义信号,并将信号连接到指定的槽函数,当满足指定条件后发送此信号。

from PyQt6.QtCore import QThread, pyqtSignal, QDateTime
class Worker(QThread):
    strOutSignal=pyqtSignal(str)
    def __init__(self,parent=None):
        super(Worker,self).__init__(parent)
        self.working=True
    def run(self):
        while self.working ==True:
            time=QDateTime.currentDateTime()
            timeStr=time.toString("yyyy-MM-dd hh:mm:ss dddd")
            self.strOutSignal.emit(timeStr)
            self.sleep(1)

通过pyqt ui实现页面操作及显示:

import sys
from PyQt6.QtWidgets import QPushButton, QApplication, QWidget, QListWidget, QGridLayout


class MyWidget(QWidget):
    def __init__(self, parent=None):
        super(MyWidget, self).__init__(parent)
        self.setWindowTitle("QThread线程测试")
        self.resize(330,120)
        self.listStr=QListWidget()
        self.pdStart=QPushButton('开始')
        layout=QGridLayout(self)
        layout.addWidget(self.listStr,0,0,1,2)
        layout.addWidget(self.pdStart,1,1)
        self.pdStart.clicked.connect(self.threadStart)

        self.thread=Worker()
        self.thread.strOutSignal.connect(self.listStrAdd)
    def listStrAdd(self, strInf):
        self.listStr.addItem(strInf)

    def threadStart(self):
        self.pdStart.setEnabled(False)
        self.thread.start()


if __name__=='__main__':
    app = QApplication(sys.argv)
    w = MyWidget()
    w.show()
    sys.exit(app.exec())


本文至此结束,喜欢点赞关注,您的关注和点赞是路卿进步的动力哦!老Baby们!!!

标签:__,定时器,23,self,PyQt6,线程,def,QThread
From: https://blog.csdn.net/weixin_38298363/article/details/140904931

相关文章

  • SSM大学生身心健康管理系统的设计与实现d223r 带论文文档1万字以上
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表系统内容:学生,测试人员,班级信息,学院信息,身心健康开题报告内容一、选题背景与意义随着教育水平的不断提升和社会竞争的日益激烈,大学生面临着来自学业、就业......
  • 5、Qt-pyqt6常用基本控件 - 按钮控件
    Buttons--按钮类控件名说明PushButton按钮ToolButton工具按钮RadioButton单选按钮CheckBox复选框CommandLinkButton命令链接按钮DialogButtonBox对话框按钮盒......
  • JavaEE 第1节 认识多线程
    本节目标(全是重点,都必须掌握)1、了解什么是线程、多线程、进程以及他们之间的关系2、了解多线程的优势以及各种特性3、用Java掌握多种创建线程的方法一、线程、多线程、进程1、概念1.基本概念这三个名词的概念可以用一个餐馆的厨房和厨师来进行超级形象的比喻。想象一下......
  • 谈一谈编程到底应该怎么学?-暨2023年 CSP-J2轮爆零总结
    谈一谈编程到底应该怎么学?-暨2023年CSP-J2轮爆零总结转自https://mp.weixin.qq.com/s/_Fi64pYrZ6tHfKaNDb3xAA今年的信息学奥赛复赛结果已经基本出来了,整个行业讨论最多的就是今年的爆0问题。据说一个省,总共1900多人参加J组复赛,有800个0分。其它各省也都是爆0很多。但是同......
  • CVE-2023-26469 复现
    题目描述:Jorani是一款开源的员工考勤和休假管理系统,适用于中小型企业和全球化组织,它简化了员工工时记录、休假请求和审批流程,并提供了多语言支持以满足不同地区的需求。在Jorani1.0.0中,攻击者可以利用路径遍历来访问文件并在服务器上执行代码。这是一个csrf的洞,找了一下,......
  • Linux中的线程3
    死锁在Linux操作系统中,死锁(Deadlock)是指两个或多个进程(或线程)在执行过程中,因互相持有对方所需的资源而又都在等待对方释放资源,导致它们都无法继续执行下去的一种状态。这种僵局会浪费系统资源,甚至可能导致系统崩溃。案例://线程A和B,以及资源X和Y的初始状态资源X:空闲资......
  • 锁撤销阈值达到20次批量重偏向是针对类还是线程?撤销阈值达到20次触发的20是指撤销偏向
    先说答案, 锁的批量重偏向是针对类的,且只能触发一次,撤销阈值20次是指撤销19个对象偏向锁后再来一个对象需要撤销才会触发锁的批量重偏向,实际会撤销19个。测试过程如下:建立spring项目,要有依赖<dependency><groupId>org.openjdk.jol</groupId>......
  • CVE-2022-4230 复现
    题目描述:WPStatisticsWordPress插件13.2.9之前的版本不会转义参数,这可能允许经过身份验证的用户执行SQL注入攻击。默认情况下,具有管理选项功能(admin+)的用户可以使用受影响的功能,但是该插件有一个设置允许低权限用户也可以访问它。根据描述,我们直接去查看wp-admin路......
  • 进程间通信与线程间通信的方法汇总
    目录一、进程间通信机制管道(pipe):命名管道(FIFO):消息队列(MQ):信号量(semaphore):共享内存(sharedmemory):信号(signal):内存映射(mappedmemory):内存映射和共享内存的区别Socket:二、线程间通信与同步机制Linux平台下:信号(Signal):锁机制:条件变量(ConditionVariable):......
  • Java通过redis实线多线程多用户操作时添加锁
    背景由于项目中多出涉及同步数据,同步过程就是从设备上查询数据,将数据库中该设备数据删除,将新数据导入到数据库;多次同步数据或多用户操作,会导致数据库出现重复数据,例如,两个线程同时删除设备数据,同时导入数据,就会出现双倍数据;还有线程1正在导入数据,中途线程2将线程1导入数据之前删......