文字loading加载

效果

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)  # 每个字符的初始透明度为0self.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 = Truefor i in range(len(self.baseText)):if self.dropDelays[i] > 0:self.dropDelays[i] -= 1else:if self.alphaValues[i] < 255:self.alphaValues[i] = min(255, self.alphaValues[i] + 15)self.yValues[i] += 2complete = Falseself.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 += 5self.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.rhkb.cn/news/425522.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

django-admin自定义功能按钮样式

位置在原来的django-admin 栏中的上方【会因为屏幕大小而变换位置】 <!-- 这里是不会替换掉旧的 添加按钮 &#xff0c;而是添加多一个按钮【点击Crawl Data】--> <!-- /home/luichun/lc/Pyfile/Pywebback/app/paqu/templates/admin/yourmodel_changelist.html -->…

深度揭秘:日志打印的艺术与实战技巧,让你的代码会说话!

&#x1f351;个人主页&#xff1a;Jupiter. &#x1f680; 所属专栏&#xff1a;Linux从入门到进阶 欢迎大家点赞收藏评论&#x1f60a; 目录 &#x1f341;日志&#x1f342;日志分模块实现讲解&#x1f343;日志等级的实现&#x1f965;日志时间*时间的获取* &#x1f308;文…

web基础之文件上传

1.下载安装 下载地址 链接&#xff1a;百度网盘-链接不存在 提取码&#xff1a;jhks 安装 直接把他放在phpstudy的WWW目录中。&#xff08;phpstudy的下载安装&#xff0c;可以自行百度一下&#xff09; 打开 访问地址&#xff1a;127.0.0.1/upload-labs 问题 这里可能…

开源PDF工具 Apache PDFBox 认识及使用(知识点+案例)

文章目录 一、认识PDFBox一、pandas是什么&#xff1f;二、导入依赖三、基础功能demo1&#xff1a;读取pdf所有内容demo2&#xff1a;读取所有页内容&#xff08;分页&#xff09;demo3&#xff1a;添加页眉、页脚demo4&#xff1a;添加居中45文字水印demo5&#xff1a;添加图片…

数据结构——栈和队列(队列的定义、顺序队列以及链式队列的基本操作)

目录 队列&#xff08;queue&#xff09;的定义 顺序队——队列的顺序表示和实现 顺序队列&#xff08;循环队列&#xff09;的类型定义 顺序队列上溢问题的解决方法 ​编辑 循环队列的基本操作 队列的基本操作——队列的初始化 队列的基本操作——求队列的长度 队列的…

Element UI入门笔记(个人向)

Element UI入门笔记 将页面分割为一级菜单、二级菜单、导航栏三个部分&#xff1b;使用npm下载安装&#xff0c;使用语句npm i element-ui -s; 布局组件 el-form 用于创建和管理表单&#xff1b;从属性上看&#xff1a; :model&#xff1a;用于双向数据绑定&#xff0c;将表单…

Windows下SDL2创建最简单的一个窗口

先看运行效果 再上代码&#xff1a; #include <stdio.h> #include "SDL.h"int main(int argc, char* argv[]) {// 初始化SDL视频子系统if (SDL_Init(SDL_INIT_VIDEO) -1){printf("Error: %s\n", SDL_GetError());return -1;} // 创建一个窗口SDL_…

『功能项目』战士职业平A怪物掉血【44】

我们打开上一篇43事件中心的项目&#xff0c; 本章要做的事情是给主角增加一个xxxCtrl.cs脚本&#xff0c;再创建一个xxxOpt.cs调用xxxCtrl.cs机制层利用事件中心再写一个主角战士平A对怪物的伤害 首先创建脚本&#xff1a;PlayerCtrl.cs using UnityEngine; public class Pla…

JavaScript 笔记汇总

JavaScript 笔记汇总 引入方式 内部方式 通过 script 标签包裹 JavaScript 代码。 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>JavaScript 基础 - 引入方式</title> </head> <…

校园社团|基于springBoot的校园社团信息管理系统设计与实现(附项目源码+论文+数据库)

私信或留言即免费送开题报告和任务书&#xff08;可指定任意题目&#xff09; 目录 一、摘要 二、相关技术 三、系统设计 四、数据库设计 五、核心代码 六、论文参考 七、源码获取 一、摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信…

顺序表(c语言实现)

顺序表是一种数据结构&#xff0c;它在计算机内存中以连续的存储位置来存储数据元素。 一、特点 1. 随机访问&#xff1a;可以在常数时间内访问特定位置的元素&#xff0c;例如&#xff0c;通过下标可以快速找到对应元素。 2. 存储密度高&#xff1a;不需要额外的指针来链接…

【运维监控】Prometheus+grafana+kafka_exporter监控kafka运行情况

运维监控系列文章入口&#xff1a;【运维监控】系列文章汇总索引 文章目录 一、prometheus二、grafana三、部署kafka_exporter1、下载2、解压3、配置4、启动5、验证 四、prometheus集成grafana监控kafka1、修改prometheus配置2、导入grafana模板3、验证 本示例通过kafka_export…

从0书写一个softmax分类 李沐pytorch实战

输出维度 在softmax 分类中 我们输出与类别一样多。 数据集有10个类别&#xff0c;所以网络输出维度为10。 初始化权重和偏置 torch.norma 生成一个均值为 0&#xff0c;标准差为0.01,一个形状为size(num_inputs, num_outputs)的张量偏置生成一个num_outputs 10 的一维张量&a…

【计网】数据链路层:概述之位置|地位|链路|数据链路|帧

✨ Blog’s 主页: 白乐天_ξ( ✿&#xff1e;◡❛) &#x1f308; 个人Motto&#xff1a;他强任他强&#xff0c;清风拂山岗&#xff01; &#x1f4ab; 欢迎来到我的学习笔记&#xff01; ① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ 1. 在OSI体系结构中的位置 1. 位置&#xff1a;数…

ICMP

目录 1. 帧格式2. ICMPv4消息类型(Type = 0,Code = 0)回送应答 /(Type = 8,Code = 0)回送请求(Type = 3)目标不可达(Type = 5)重定向(Type = 11)ICMP超时(Type = 12)参数3. ICMPv6消息类型回见TCP/IP 对ICMP协议作介绍 ICMP(Internet Control Message Protocol…

即插即用!高德西交的PriorDrive:统一的矢量先验地图编码,辅助无图自动驾驶

Driving with Prior Maps: Unified Vector Prior Encoding for Autonomous Vehicle Mapping 论文主页&#xff1a;https://misstl.github.io/PriorDrive.github.io/ 论文链接&#xff1a;https://arxiv.org/pdf/2409.05352 代码链接&#xff1a;https://github.com/missTL/Pr…

基于python+django+vue的学生成绩管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于协同过滤pythondjangovue…

用Python解决综合评价问题_模糊综合评价,决策树与灰色关联分析

一&#xff1a;模糊综合评价 模糊综合评价是一种有效的处理不确定性和模糊性的评价方法&#xff0c;特别是在人才评价等领域。它允许我们综合考虑多个评价指标&#xff0c;并给出一个综合的评价结果。以下是利用模糊综合评价对人才进行评价的步骤&#xff1a; 确定评价指标&am…

Git常用指令整理【新手入门级】【by慕羽】

Git 是一个分布式版本控制系统&#xff0c;主要用于跟踪和管理源代码的更改。它允许多名开发者协作&#xff0c;同时提供了强大的功能来管理项目的历史记录和不同版本。本文主要记录和整理&#xff0c;个人理解的Git相关的一些指令和用法 文章目录 一、git安装 & 创建git仓…

【AI大模型】ChatGPT模型原理介绍(上)

目录 &#x1f354; 什么是ChatGPT&#xff1f; &#x1f354; GPT-1介绍 2.1 GPT-1模型架构 2.2 GPT-1训练过程 2.2.1 无监督的预训练语言模型 2.2.2 有监督的下游任务fine-tunning 2.2.3 整体训练过程架构图 2.3 GPT-1数据集 2.4 GPT-1模型的特点 2.5 GPT-1模型总结…