文字loading加载

news2024/11/15 11:27:51

效果

1. 导入库

import sys from PyQt5.QtCore import QTimer, Qt, QThread, pyqtSignal 
from PyQt5.QtGui import QPainter, QFont, QColor, QBrush 
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton, QProgressBar, QLabel

代码首先导入了PyQt5库中的几个模块:

  • QTimer: 用于定时执行某些操作,比如动画的逐帧更新。
  • Qt, QThread, pyqtSignal: Qt用于定义窗口属性和对齐方式,QThread用于后台任务,pyqtSignal用于发出信号通知任务完成。
  • QPainter, QFont, QColor, QBrush: 这些类用于绘制自定义的内容,如绘制文本、设置字体、颜色和背景。
  • QApplication, QWidget, QVBoxLayout, QPushButton, QProgressBar, QLabel: 用于构建基础的GUI界面。

2. LoadingDialog 类

class LoadingDialog(QLabel):
    def __init__(self, parent=None, size_ratio=0.3):
        super().__init__(parent, Qt.Dialog | Qt.FramelessWindowHint)
        self.setAttribute(Qt.WA_TranslucentBackground)
        self.baseText = "Loading..."
        self.resize(int(parent.width() * size_ratio), int(parent.height() * size_ratio))
        self.setAlignment(Qt.AlignCenter)
        self.animation_complete = False
  • 该类继承自QLabel,主要负责显示“Loading...”字样的动画效果。
  • size_ratio决定了加载对话框相对于父窗口的大小(默认是30%的父窗口大小)。
  • Qt.FramelessWindowHint让窗口没有边框,Qt.WA_TranslucentBackground让背景透明。
  • baseText是动画中显示的文本“Loading...”。

定时器和动画状态:

self.timer = QTimer() self.timer.timeout.connect(self.updateLoadingText) 
self.resetAnimation()
  • 使用定时器QTimer来控制动画帧的更新。每15毫秒调用一次updateLoadingText方法,控制每个字母的状态。

resetAnimation()方法:

def resetAnimation(self):
    self.alphaValues = [0] * len(self.baseText)  # 每个字符的初始透明度为0
    self.yValues = [-50] * len(self.baseText)  # 所有字符从视图上方开始
    self.dropDelays = [i * 5 for i in range(len(self.baseText))]  # 每个字符的下降有不同的延迟
    self.animation_complete = False
  • 该方法初始化动画的状态:
    • alphaValues:用于控制每个字符的透明度,实现淡入效果。
    • yValues:控制字符的垂直位置,从-50开始,即所有字符从视图上方掉落。
    • dropDelays:为每个字符设置不同的延迟,使它们不会同时出现。

startAnimation()与stopAnimation()方法:

def startAnimation(self):
    self.resetAnimation()
    self.centerInParent()
    self.timer.start(15)
    self.show()

def stopAnimation(self):
    self.timer.stop()
    self.hide()
  • startAnimation()重置动画状态,并启动定时器使字符逐帧下降。
  • stopAnimation()停止定时器并隐藏对话框。

updateLoadingText()方法:

def updateLoadingText(self):
    complete = True
    for i in range(len(self.baseText)):
        if self.dropDelays[i] > 0:
            self.dropDelays[i] -= 1
        else:
            if self.alphaValues[i] < 255:
                self.alphaValues[i] = min(255, self.alphaValues[i] + 15)
                self.yValues[i] += 2
                complete = False

    self.update()

    if complete and not self.animation_complete:
        self.resetAnimation()
  • 该方法控制每个字符的淡入(通过透明度变化)和掉落(通过Y轴位置变化)。
  • complete变量用于判断动画是否完成。

paintEvent()方法:

def paintEvent(self, event):
    painter = QPainter(self)
    painter.setRenderHint(QPainter.Antialiasing)
    painter.setFont(QFont("Arial", 18))
    
    for i, char in enumerate(self.baseText):
        char_x = int(start_x + painter.fontMetrics().width(self.baseText[:i]))
        char_y = int(start_y + self.yValues[i])
        painter.setPen(QColor(100, 181, 246, self.alphaValues[i]))
        painter.drawText(char_x, char_y, char)
  • 该方法绘制每个字符的位置和透明度,随着定时器的更新不断刷新界面。

3. BackgroundTask 类

 
class BackgroundTask(QThread):
    finished = pyqtSignal()

    def run(self):
        QThread.sleep(5)
        self.finished.emit()

  • BackgroundTask类继承自QThread,用于模拟后台任务。
  • run()方法通过QThread.sleep(5)模拟5秒的延迟,任务完成后发出finished信号通知主界面。

4. LoadingWidget 类

 
class LoadingWidget(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()
        self.overlay = LoadingDialog(self)
        self.background_task = BackgroundTask()
        self.background_task.finished.connect(self.onLoadComplete)

  • LoadingWidget类是主窗口,包含按钮和进度条。
  • 它创建了LoadingDialog实例用于显示加载动画,并设置了一个后台任务BackgroundTask来处理耗时操作。
  • 当后台任务完成时,会调用onLoadComplete方法。

initUI()方法:

 
def initUI(self):
    layout = QVBoxLayout()
    self.button = QPushButton('开始加载', self)
    self.button.clicked.connect(self.startLoading)
    layout.addWidget(self.button)
    self.progressBar = QProgressBar(self)
    layout.addWidget(self.progressBar)
    self.setLayout(layout)
    self.setWindowTitle('逐字加载动画示例')
    self.resize(400, 300)
    self.progressTimer = QTimer()
    self.progressTimer.timeout.connect(self.updateProgress)
    self.progress = 0

  • initUI()方法创建了一个按钮和进度条,并将它们添加到布局中。

startLoading()方法:

 
def startLoading(self):
    self.overlay.startAnimation()
    self.background_task.start()

  • startLoading()启动加载动画并开始后台任务。

onLoadComplete()与updateProgress()方法:

 
def onLoadComplete(self):
    self.overlay.stopAnimation()
    self.progressTimer.start(100)

def updateProgress(self):
    self.progress += 5
    self.progressBar.setValue(self.progress)
    if self.progress >= 100:
        self.progressTimer.stop()

  • 当后台任务完成时,onLoadComplete()停止加载动画并启动进度条更新。
  • updateProgress()每100毫秒更新一次进度条,直到进度条填满为止。

5. 主程序

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = LoadingWidget()
    ex.show()
    sys.exit(app.exec_())

  • 程序的入口,创建QApplication实例并显示主窗口。

总结

这个程序实现了一个具有动画加载效果的PyQt5 GUI应用。主要特点包括:

  • “Loading...”文字的逐字动画效果,每个字母依次从上方淡入并落下。
  • 一个模拟耗时操作的后台任务。
  • 在任务完成后,进度条逐渐填满。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2141876.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

编辑器拓展(入门与实践)

学习目标:入门编辑器并实现几个简单的工具 菜单编辑器 MenuItem [MenuItem("编辑器拓展/MenuItem")]static void MenuItem(){Debug.Log("这是编辑器拓展");} } 案例 1&#xff1a;在场景中的 GameObject 设置 1. 设置面板2. 直接创建 GameObject 结构…

2-96 基于matlab的SMOTE数据扩充算法

基于matlab的SMOTE数据扩充算法&#xff0c;主动设置数据扩充百分比&#xff0c;并考虑最近邻居数进行扩充&#xff0c;计算样本到他所在类样本集中所有样本距离&#xff0c;从样本的K近邻中随机选择若干样本添加到扩充样本集。程序已调通&#xff0c;可直接运行。 下载源程序…

c++中引用是通过指针的方式实现

其实在汇编层面上&#xff0c;引用的代码和指针的代码是一致的。 先看指针情况下的代码分析&#xff0c;如下所示&#xff1a; #include <iostream>using namespace std;void fuzhi(int *x)//引用传参 {*x 10; }int main(int argc, char** argv) {int a 0;int b;a …

LeetCode[简单] 283.移动零

给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 思路&#xff1a;利用快慢指针&#xff0c;快指针遍历数组&#xff0c;慢指针是非零元素索…

【D3.js in Action 3 精译_023】3.3 使用 D3 将数据绑定到 DOM 元素

当前内容所在位置&#xff1a; 第一部分 D3.js 基础知识 第一章 D3.js 简介&#xff08;已完结&#xff09; 1.1 何为 D3.js&#xff1f;1.2 D3 生态系统——入门须知1.3 数据可视化最佳实践&#xff08;上&#xff09;1.3 数据可视化最佳实践&#xff08;下&#xff09;1.4 本…

销管系统 —— P14 菜单项悬停高亮显示遇到的问题

悬停在子菜单背景颜色并没有显示&#xff0c;为什么&#xff1a; 什么是后代选择器 —— 选中父元素 后代中 满足条件的元素&#xff1b;这个子菜单menu—item它既满足上面的也满足下面的&#xff0c;按这个顺序的话&#xff0c;下面的就被覆盖了&#xff08;CSS优先级规则&…

Nginx实用篇:实现负载均衡、限流与动静分离

Nginx实用篇&#xff1a;实现负载均衡、限流与动静分离 | 原创作者/编辑&#xff1a;凯哥Java | 分类&#xff1a;Nginx学习系列教程 Nginx 作为一款高性能的 HTTP 服务器及反向代理解决方案&#xff0c;在互联网架构中扮演着至关重要的角色。它…

可视化深度网络的强大工具:Grad-CAM介绍与使用步骤

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发…

第一次安装Pytorch

1、新版本的Anaconda内置的python版本是3.12&#xff0c; 目前 Windows 上的 PyTorch 仅支持 Python 3.8-3.11;不支持 Python 2.x。 1、创建运行环境 在不创建虚拟环境的情况下&#xff0c;不建议使用最新的Python和Anaconda。 在几次失败后&#xff0c;我使用的是Anaconda3-2…

单相可控整流电路(单相半波整流电路、单相桥式全控整流电路)

目录 1. 单相半波整流电路 2. 单相桥式全控整流电路 单相可控整流电路是利用可控硅&#xff08;晶闸管&#xff09;将交流电转换为直流电的电路&#xff0c;主要有两种常见类型&#xff1a;单相半波整流电路和单相桥式全控整流电路。 1. 单相半波整流电路 单相半波整流电路是…

python实现多个pdf文件合并

打印发票时&#xff0c;需要将pdf合并成一个&#xff0c;单页两张打印。网上一些pdf合并逐渐收费&#xff0c;这玩意儿都能收费&#xff1f;自己写一个脚本使用。 实现代码&#xff1a; 输入pdf文件夹路径data_dir&#xff0c;统计目录下的“合并后的PDF”文件夹下&#xff0c;…

十六,Spring Boot 整合 Druid 以及使用 Druid 监控功能

十六&#xff0c;Spring Boot 整合 Druid 以及使用 Druid 监控功能 文章目录 十六&#xff0c;Spring Boot 整合 Druid 以及使用 Druid 监控功能1. Druid 的基本介绍2. 准备工作&#xff1a;3. Druid 监控功能3.1 Druid 监控功能 —— Web 关联监控3.2 Druid 监控功能 —— SQL…

数组学习内容

动态初始化 只给长度&#xff0c;数据类型【】 数组名new 数据类型【数组长度】 内存图

MySQL篇(数值函数/)(持续更新迭代)

目录 常见函数一&#xff1a;数值函数 一、常见数值函数 1. 基本函数 2. 角度与弧度互换函数 3. 三角函数 4. 指数与对数 5. 进制间的转换 常见函数二&#xff1a;日期函数 一、常见日期函数 二、SQL演示 1. curdate&#xff1a;当前日期 2. curtime&#xff1a;当前…

ThreadX源码:Cortex-A7的tx_thread_context_save.S(线程上下文保存)汇编代码分析

0 参考资料 Cortex M3权威指南(中文).pdf&#xff08;可以参考ARM指令集用法&#xff09; 1 前言 tx_thread_context_save.S是用来实现Cortex-A7下线程上下文保存的函数所在汇编文件。 2 源码分析 2.1 概述 _tx_thread_context_save函数用于在线程被中断打断后保存上下文&a…

「Next.js中文文档」网站发布

大家好&#xff0c;我是程普&#xff08;weijunext&#xff09;&#xff0c;我联合“阿伟dev”搭建了一个「Next.js 中文文档」网站&#x1f447; 这个网站我们设计得很特别&#xff1a; 样式很特别 我们模仿 Next.js 官方网站样式&#xff0c;努力做到除了语言不同&#xff…

进程相关的系统调用

文章目录 进程进程相关的系统调用wait函数waitpid函数示例--使用wait fork函数创建子进程并使用宏验证子进程的退出状态信息示例--使用waitpid函数检测子进程是否进入暂停状态 exec族函数示例--exec族函数的使用 system函数示例--使用system函数执行外部指令 进程状态切换 进程…

Vue2电商平台项目 (三) Search模块、面包屑(页面自己跳自己)、排序、分页器!

文章目录 一、Search模块1、Search模块的api2、Vuex保存数据3、组件获取vuex数据并渲染(1)、分析请求数据的数据结构(2)、getters简化数据、渲染页面 4、Search模块根据不同的参数获取数据(1)、 派发actions的操作封装为函数(2)、设置带给服务器的参数(3)、Object.assign整理参…

第十一章 【后端】商品分类管理微服务(11.1)——创建父工程

第十一章 【后端】商品分类管理微服务 11.1 创建父工程 项目名称:EasyTradeManagerSystem:Easy 表示简单易用,Trade 表示交易,Manager 表示管理,System 表示系统,强调系统在商品交易管理方面的便捷性,简称 etms。 新建工程 yumi-etms yumi-etms 作为所有模块的父工程,…

基于java 的医院排号管理系统设计与实现

博主介绍&#xff1a;专注于Java .net php phython 小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设&#xff0c;从业十五余年开发设计教学工作 ☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不然下次找不到哟 我的博客空间发布了1000毕设题目 方便大家学习使用 感兴趣的可以…