文章目录

  • 前言
  • 一、下载需求构思
  • 二、搜索“pyqt 下载文件”案例
  • 三、分析案例

前言

当前很多人张口就问问题,而不愿意搜索,这个一直在某某群里面被病垢、吐槽!
今天以我第一次需要搞“Pyqt下载功能”为例入题,讲讲我是如何“面向百度编程”的!


提示:以下是本篇文章正文内容,下面案例可供参考

一、下载需求构思

在写“PyQt快速开发框架”过程一直被领导提到如何发布更新,图形化界面更新是很麻烦的。比较常规的都是提供下载更新按钮,下载最新安装包进行更新安装。
但是有python打包文件比较多(使用的模块越多越大),当前打包文件有400M,每次一个小改动就进行全量更新提供有违设计初衷。当前构思提供更新清单页面进行小范围更新。

二、搜索“pyqt 下载文件”案例

代码如下(来源:https://blog.csdn.net/seniorwizard/article/details/111994757):

import sys
from PyQt5.QtCore import Qt, QDir, QFile, QFileInfo, QIODevice, QUrl
from PyQt5.QtWidgets import (QApplication, QDialog, QDialogButtonBox,QHBoxLayout, QVBoxLayout, QLabel, QLineEdit,QProgressDialog, QMessageBox, QPushButton)
from PyQt5.QtNetwork import QNetworkAccessManager, QNetworkRequest, QNetworkReplyclass DemoDownloadFile(QDialog):def __init__(self, parent=None):super(DemoDownloadFile, self).__init__(parent)# 设置窗口标题self.setWindowTitle('实战 Qt for Python: 文件下载')# 设置窗口大小self.resize(400, 120)self.url = QUrl()self.nam = QNetworkAccessManager()self.reply = Noneself.outFile = Noneself.httpGetId = 0self.httpRequestAborted = Falseself.initUi()def initUi(self):# 编辑下载地址self.urlLineEdit = QLineEdit('https://www.qt.io')urlLabel = QLabel('网址(&U):')urlLabel.setBuddy(self.urlLineEdit)# 状态信息self.statusLabel = QLabel('在这里输入要下载的文件的网址。')self.statusLabel.setWordWrap(True)# 下载和退出按钮self.btnDownload = QPushButton('下载')self.btnDownload.setDefault(True)self.btnQuit = QPushButton('退出')self.btnQuit.setAutoDefault(False)buttonBox = QDialogButtonBox()buttonBox.addButton(self.btnDownload, QDialogButtonBox.ActionRole)buttonBox.addButton(self.btnQuit, QDialogButtonBox.RejectRole)# 进度显示对话框self.progressDialog = None# 连接slot函数self.urlLineEdit.textChanged.connect(self.enableDownloadButton)self.nam.authenticationRequired.connect(self.slotAuthenticationRequired)self.nam.sslErrors.connect(self.sslErrors)self.btnDownload.clicked.connect(self.downloadFile)self.btnQuit.clicked.connect(self.close)topLayout = QHBoxLayout()topLayout.addWidget(urlLabel)topLayout.addWidget(self.urlLineEdit)mainLayout = QVBoxLayout()mainLayout.setSpacing(16)mainLayout.addLayout(topLayout)mainLayout.addWidget(self.statusLabel)mainLayout.addWidget(buttonBox)mainLayout.addStretch(1)self.setLayout(mainLayout)self.urlLineEdit.setFocus()# 发出下载请求def startRequest(self, url):self.reply = self.nam.get(QNetworkRequest(url))self.reply.finished.connect(self.httpFinished)self.reply.readyRead.connect(self.httpReadyRead)self.reply.downloadProgress.connect(self.updateDataReadProgress)# 下载文件def downloadFile(self):self.url = QUrl(self.urlLineEdit.text())fileInfo = QFileInfo(self.url.path())filename = fileInfo.fileName()# 如果没有文件名,就假定一个缺省文件if not filename:filename = 'index.html'# 如果存储目录有相同文件名称,则询问是否覆盖if QFile.exists(filename):ret = QMessageBox.question(self, '下载文件','在当前目录下已经存着文件 %s。覆盖它吗?' % filename,QMessageBox.Yes | QMessageBox.No, QMessageBox.No)if ret == QMessageBox.No:return# 删除原来的文件QFile.remove(filename)self.outFile = QFile(filename)if not self.outFile.open(QIODevice.WriteOnly):QMessageBox.information(self, '下载文件','不能保存文件 %s: %s.' % (filename, self.outFile.errorString()))self.outFile = Nonereturnself.progressDialog = QProgressDialog(self)self.progressDialog.canceled.connect(self.cancelDownload)self.progressDialog.setWindowTitle('下载文件')self.progressDialog.setLabelText('正在下载 %s.' % filename)self.btnDownload.setEnabled(False)self.httpRequestAborted = Falseself.startRequest(self.url)# 终止下载def cancelDownload(self):self.statusLabel.setText('下载被取消了.')self.httpRequestAborted = Trueif self.reply is not None:self.reply.abort()self.btnDownload.setEnabled(True)# 下载完成后def httpFinished(self):# 释放进度对话框if self.progressDialog is not None:self.progressDialog.hide()self.progressDialog.deleteLater()self.progressDialog = None# 如果被终止下载了,做相应的善后处理if self.httpRequestAborted:if self.outFile is not None:self.outFile.close()self.outFile.remove()self.outFile = Noneself.reply.deleteLater()self.reply = Nonereturnself.outFile.flush()self.outFile.close()redirectionTarget = self.reply.attribute(QNetworkRequest.RedirectionTargetAttribute)if self.reply.error():self.outFile.remove()QMessageBox.information(self, '文件下载','下载失败: %s.' % self.reply.errorString())self.btnDownload.setEnabled(True)elif redirectionTarget is not None:newUrl = self.url.resolved(redirectionTarget)ret = QMessageBox.question(self, '下载文件', '重定向到文件 %s?' % newUrl.toString(),QMessageBox.Yes | QMessageBox.No)if ret == QMessageBox.Yes:self.url = newUrlself.reply.deleteLater()self.reply = Noneself.outFile.open(QIODevice.WriteOnly)self.outFile.resize(0)self.startRequest(self.url)returnelse:filename = QFileInfo(QUrl(self.urlLineEdit.text()).path()).fileName()self.statusLabel.setText('文件 %s 下载到 %s.' % (filename, QDir.currentPath()))self.btnDownload.setEnabled(True)self.reply.deleteLater()self.reply = Noneself.outFile = None# 保存下载的数据def httpReadyRead(self):if self.outFile is not None:self.outFile.write(self.reply.readAll())# 更新进度对话框的进度显示信息def updateDataReadProgress(self, bytesRead, totalBytes):if self.httpRequestAborted:returnif self.progressDialog is not None:self.progressDialog.setMaximum(totalBytes)self.progressDialog.setValue(bytesRead)# 下载地址发生了改变,如果地址为空,则禁用下载按钮,否则启用def enableDownloadButton(self):self.btnDownload.setEnabled(self.urlLineEdit.text() != '')# 处理许可下载信息def slotAuthenticationRequired(self, authenticator):import osfrom PyQt5 import uicui = os.path.join(os.path.dirname(__file__), 'authenticationdialog.ui')dlg = uic.loadUi(ui)dlg.adjustSize()dlg.siteDescription.setText('%s at %s' % (authenticator.realm(), self.url.host()))dlg.userEdit.setText(self.url.userName())dlg.passwordEdit.setText(self.url.password())if dlg.exec() == QDialog.Accepted:authenticator.setUser(dlg.userEdit.text())authenticator.setPassword(dlg.passwordEdit.text())# SSL 错误处理def sslErrors(self, reply, errors):errorString = ", ".join([str(error.errorString()) for error in errors])ret = QMessageBox.warning(self, 'HTTP 文件下载示例','发生了SSL错误: %s' % errorString,QMessageBox.Ignore | QMessageBox.Abort)if ret == QMessageBox.Ignore:self.reply.ignoreSslErrors()if __name__ == '__main__':app = QApplication(sys.argv)window = DemoDownloadFile()window.show()sys.exit(app.exec())

网上找一个下载链接填入到网址栏里面,执行结果:


三、分析案例

以上代码已经实现通过URL进行下载功能,但是直接使用肯定不能够切入到我的框架项目中,需要实现以下几个功能才行,第一步提取下载模块到我的公共模块中,供项目调用大概功能如下:

def downFile(url):# 根据url下载文件# 弹出存储路径选择对话框,如果存在则提示是否覆盖# 允许中止# 返回值:中止、成功、失败pass

在框架项目下提供的下载界面大概如下:
对比本地目录下如果服务器上提供文件的md5值是否一致,如果不一致提供下载清单,并提供一个下载按钮,按钮逻辑:遍历下载清单,调度downFile,根据返回值决定是否继续下载下一个文件。
更新逻辑:
项目本身提供动态加装功能,按快捷键即可重载动态模块部分;非动态模块,不能够直接覆盖,需要重启时加装相关模块之前就进行覆盖操作,所以下载到临时路径下,等待下次启动时,在未加装模块之前进行更新操作。

PS: 另外还需实现后台提供下载服务器,这个功能再一次百度才行

面向百度编程(pyqt篇)相关推荐

  1. Swift 面向协议编程 基础篇 (一) 介绍

    前言 好久没有写文章了,期末复习周也到了.在复习的同时顺便开了一个专题,面向协议编程,[ 基础篇 ],[ 进阶篇 ],[ 实践篇 ]. 介绍 首先,面向对象(OOP)大家并不陌生,苹果的很多框架都是以 ...

  2. Spring AOP面向切面编程:理解篇(一看就明白)

    一直想着怎么去通俗的讲解AOP,看了一篇文章受到了启发(https://blog.csdn.net/qukaiwei/article/details/50367761),下面我加入自己的理解,咱们来说 ...

  3. Spring.NET学习笔记12——面向切面编程(基础篇) Level 300

    AOP即面向切面编程(Aspect Oriented Programming的缩写),是OOP(面向对象编程)的一种延续形式.是通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添 ...

  4. Java切面理解_Spring AOP面向切面编程:理解篇

    package com.vx.servicehi.annotation; import java.lang.annotation.Annotation; import java.lang.reflec ...

  5. freemark模板框架+quartz定时框架入门学习(面向百度编程)

    需求,定时查询表数据,生成表格,发送给员工, 相关技术 : quartz freemark Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2 ...

  6. 神理论 | 我面向淘宝编程,而你面向什么编程?(文末赠书5本)

    神理论 | 我面向淘宝编程,而你面向什么编程? 陌生人一定会疑问,嵌入式跟taobao有半毛钱关系啊?那么本文,博主就跟你聊聊,如何面向淘宝学习嵌入式! 文章目录 1 写在前面 2 面向XXX编程 3 ...

  7. 如何用ABP框架快速完成项目(面向项目交付编程面向客户编程篇) - 广州.net微软技术俱乐部12月份活动报名帖...

    这是广州.net微软技术俱乐部12月份活动报名帖.此帖会持续更新. 活动课程标题是:如何用ABP框架快速完成项目(面向项目交付编程面向客户编程篇) 这是内容大纲: ABP框架简介(这里会聊聊.net真 ...

  8. 定了!百度运维工程师非法挖矿获利 10 万、被判 3 年,如何避免面向监狱编程?...

    整理 |伍杏玲 出品|程序人生(ID:coder_life) 图源|东方IC 3月12日,比特币价格跌破3800美元关口,创下近6年来最大跌幅,之后几天比特币价格略有回升,直到昨天3月16日,比特币价 ...

  9. 第七篇 - 手写Aop(面向切面编程)

    Github源码下载地址:https://github.com/chenxingxing6/sourcecode/tree/master/code-springaop 一.前言 AOP为Aspect ...

最新文章

  1. Some Rules from wrting your own dsl with ruby
  2. Davinci DM6446开发攻略——LINUX GPIO驱动源码移植
  3. 2、jeecg 笔记之 t:dictSelect 或 t:dgCol 自定义字典
  4. 通过浏览器navigator判断浏览器版本或者手机类型判断微信访问
  5. 神经网络 Log-Sum-Exp
  6. Oracle单机报监听不支持服务,(转)oracle 启动监听 报“监听程序不支持服务” 解决...
  7. java判断44数组是否是4阶幻方_2015蓝桥杯决赛Java A组 第二题--四阶幻方
  8. 用installshield打包的asp.net程序
  9. 华为云企业级Redis评测第二期:大Key操作的影响
  10. 【Tomcat】Tomcat Connector的三种运行模式【bio、nio、apr】
  11. python当当图书信息抓取
  12. access 链接mysql数据库教程_ACCESS实例教程(数据库的编程)
  13. 体脂率编程c语言,C语言程序
  14. chrome(谷歌浏览器)固定到任务栏,点击之后出现两个图标-原因及解决办法
  15. 嵌入式linux操作系统的移植 实验报告,嵌入式linux系统移植试题
  16. 洛谷P1129 [ZJOI2007] 矩阵游戏 题解
  17. too many open files in system报错处理方案
  18. 荣耀v40和华为nova8参数对比哪个好 华为nova8和荣耀v40的区别
  19. NAND flash 和 NOR flash 区别
  20. 使用webrtc-streamer查看实时监控

热门文章

  1. 【反传销】春节一个短暂误入传销和脱身的真实故事以及对技术的思考(二)回家之路...
  2. B1043 输出PATest (散列)
  3. qt 增加的翻译没有作用上_Qt语言翻译工具的使用 及 QT-Linguist国际化的简单实现...
  4. 计算机风扇英语怎么说,风扇用英语怎么说_英文单词是什么(2)
  5. 华为OD机试 - 几何平均值最大子数组(Java JS Python)
  6. 【windows】电脑上常见问题
  7. CSS3制作旋转的小风车
  8. 华为2017年实习生面试经历(研发类)
  9. 超酷!NeRF神经场工具库;李飞飞弟子亲授,CS231n进阶课;斯坦福CS520知识图谱课,当教授开始『卷』人脉;前沿论文 | ShowMeAI资讯日报
  10. 【Linux Mint】VMware虚拟机上安装Linux并配置并下载pycharm