当前位置: 首页 > news >正文

pyqt5的下载进度条 实现模板

说明

QProgressBar,进度条控件,使用很简单。但如何结合下载功能,实现下载进度条呢?

本文主要参考了《PyQt5实现下载进度条》这篇文章,感谢作者的分享。
其中的下载线程,基本原封不动的照搬了,这个下载线程正是技术要点所在。

下载线程

这个下载线程,其实包含了不少知识点,可以多多借鉴参考哦。

1.pyqt5的线程 QThread
2.requests 流下载模式
3.自定义信号和槽函数

【如下代码,完全复制,直接运行,即可使用】

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *

import queue     #如果不加载这个模板,pyinstaller打包后,可能无法运行requests模板
import requests
################################################


################################################
class Widget(QWidget):
    def __init__(self, *args, **kwargs):
        super(Widget, self).__init__(*args, **kwargs)
        layout = QHBoxLayout(self)

        # 增加进度条
        self.progressBar = QProgressBar(self, minimumWidth=400)
        self.progressBar.setValue(0)
        layout.addWidget(self.progressBar)

        # 增加下载按钮
        self.pushButton = QPushButton(self, minimumWidth=100)
        self.pushButton.setText("下载")
        layout.addWidget(self.pushButton)

        # 绑定按钮事件
        self.pushButton.clicked.connect(self.on_pushButton_clicked)




    # 下载按钮事件
    def on_pushButton_clicked(self):
        the_url = 'http://cdn2.ime.sogou.com/b24a8eb9f06d6bfc08c26f0670a1feca/5c9de72d/dl/index/1553820076/sogou_pinyin_93e.exe'
        the_filesize = requests.get(the_url, stream=True).headers['Content-Length']
        the_filepath ="D:/sogou_pinyin_93e.exe"
        the_fileobj = open(the_filepath, 'wb')
        #### 创建下载线程
        self.downloadThread = downloadThread(the_url, the_filesize, the_fileobj, buffer=10240)
        self.downloadThread.download_proess_signal.connect(self.set_progressbar_value)
        self.downloadThread.start()



    # 设置进度条
    def set_progressbar_value(self, value):
        self.progressBar.setValue(value)
        if value == 100:
            QMessageBox.information(self, "提示", "下载成功!")
            return






##################################################################
#下载线程
##################################################################
class downloadThread(QThread):
    download_proess_signal = pyqtSignal(int)                        #创建信号

    def __init__(self, url, filesize, fileobj, buffer):
        super(downloadThread, self).__init__()
        self.url = url
        self.filesize = filesize
        self.fileobj = fileobj
        self.buffer = buffer


    def run(self):
        try:
            rsp = requests.get(self.url, stream=True)                #流下载模式
            offset = 0
            for chunk in rsp.iter_content(chunk_size=self.buffer):
                if not chunk: break
                self.fileobj.seek(offset)                            #设置指针位置
                self.fileobj.write(chunk)                            #写入文件
                offset = offset + len(chunk)
                proess = offset / int(self.filesize) * 100
                self.download_proess_signal.emit(int(proess))        #发送信号
            #######################################################################
            self.fileobj.close()    #关闭文件
            self.exit(0)            #关闭线程


        except Exception as e:
            print(e)





####################################
#程序入口
####################################
if __name__ == "__main__":
    app = QApplication(sys.argv)
    w = Widget()
    w.show()
    sys.exit(app.exec_())

本文如有帮助,敬请留言鼓励。
本文如有错误,敬请留言改进。

相关文章:

  • 用servlet校验密码2
  • PHP 生成唯一订单号函数
  • SSE图像算法优化系列二十九:基础的拉普拉斯金字塔融合用于改善图像增强中易出现的过增强问题(一)...
  • Confluence 6 LDAP 服务器配置
  • tp5.0中及其常用方法的一些函数方法(自己看)和技巧(不断添加中)
  • SpringBoot 从application.yml中通过@Value读取不到属性值
  • python开发环境
  • 网页排版布局--从里到外先搞定结构
  • 常见的Web安全及其攻防姿势
  • 利益相关者分析
  • 长春网站建设×××,网站制作的步骤
  • spring boot @ConfigurationProperties vs @Value
  • ABAP的include关键字,Java的import, C的include和C4C ABSL 的import比较
  • websocket的那些事 - 初识
  • Easyui Tab使用
  • 《网管员必读——网络组建》(第2版)电子课件下载
  • Angular4 模板式表单用法以及验证
  •  D - 粉碎叛乱F - 其他起义
  • Hexo+码云+git快速搭建免费的静态Blog
  • iOS 系统授权开发
  • JavaScript DOM 10 - 滚动
  • Koa2 之文件上传下载
  • Laravel Mix运行时关于es2015报错解决方案
  • Less 日常用法
  • mysql 5.6 原生Online DDL解析
  • mysql外键的使用
  • PHP面试之三:MySQL数据库
  • Rancher如何对接Ceph-RBD块存储
  • Spark in action on Kubernetes - Playground搭建与架构浅析
  • Windows Containers 大冒险: 容器网络
  • 蓝海存储开关机注意事项总结
  • 如何学习JavaEE,项目又该如何做?
  • 使用 Node.js 的 nodemailer 模块发送邮件(支持 QQ、163 等、支持附件)
  • 小而合理的前端理论:rscss和rsjs
  • Python 之网络式编程
  • ​Kaggle X光肺炎检测比赛第二名方案解析 | CVPR 2020 Workshop
  • ​一帧图像的Android之旅 :应用的首个绘制请求
  • $emit传递多个参数_PPC和MIPS指令集下二进制代码中函数参数个数的识别方法
  • (附源码)springboot优课在线教学系统 毕业设计 081251
  • (离散数学)逻辑连接词
  • (论文阅读31/100)Stacked hourglass networks for human pose estimation
  • (使用vite搭建vue3项目(vite + vue3 + vue router + pinia + element plus))
  • (完整代码)R语言中利用SVM-RFE机器学习算法筛选关键因子
  • (学习日记)2024.01.19
  • (一)Neo4j下载安装以及初次使用
  • (转)Oracle存储过程编写经验和优化措施
  • (转)PlayerPrefs在Windows下存到哪里去了?
  • (转)socket Aio demo
  • .Net Memory Profiler的使用举例
  • .NET Micro Framework初体验
  • .NET Standard 的管理策略
  • .NET 编写一个可以异步等待循环中任何一个部分的 Awaiter
  • .NET 反射 Reflect
  • .NET导入Excel数据
  • @manytomany 保存后数据被删除_[Windows] 数据恢复软件RStudio v8.14.179675 便携特别版...