在Python中我们有很多种方案来编写桌面图形用户界面程序,譬如内置的 Tkinter 、强大的 PyQt5 和 PySide2 ,还有 wxPython 。借助这些或内置或第三方的模块,我们可以轻松地编写跨平台的桌面图形界面程序。

同时,我们还能直接使用 PyInstaller 、 Nuitka 、 cx_Freeze 等 Python 第三方程序打包模块,将编写好桌面图形界面程序打包为各个平台的二进制可执行程序文件,比如 Windows 下的 exe 程序执行文件。

通常我们会将程序按需打包为单个的 exe可执行文件 或包含整个文件夹的可执行文件。

文章目录

很多人学习python,不知道从何学起。
很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手。
很多已经做案例的人,却不知道如何去学习更加高深的知识。
那么针对这三类人,我给大家提供一个好的学习平台,免费领取视频教程,电子书籍,以及课程的源代码!
QQ群:1097524789

程序更新

随着版本的迭代和功能的优化,我们编写的程序会需要进行更新。

在 Web 应用中,这个问题几乎不需要处理,因为只要服务器更新了,浏览器打开的页面或功能都将是最新的。

而在桌面图形界面程序中,则有点棘手。因为我们打包好的程序都是离线分发的,按照以往的流程,我们需要重新打包程序,然后,在某个页面放上新版本程序的下载链接,最后提醒使用者下载更新。

如果使用者没有注意到,那么就凉拌了。

如何解决呢?我们需要在编写的桌面图形界面程序中,额外添加一个更新机制,用于检测更新、下载更新和完成更新。

下面我们来介绍一下这个流程。

检测更新

要实现程序的更新,我们首先需要让程序能够检测到软件存在更新。在这里,我们需要一个远程的更新服务器,来提供更新的检测响应。

然后,在程序启动的时候,调用一个子线程,向远程服务器发起请求,以获得是否需要进行更新。

下载更新

如果没有程序的更新,自然就略过了。

如果有程序的更新,我们就需要对新版本的程序进行下载。

下载有两种方式:

  1. 直接通过主程序进行下载;
  2. 编写一个单独的更新程序,主程序调用更新程序进行下载;

直接通过主程序进行下载的方式对于下载是可行的,但是没法自己覆盖更新自己。所以我们选择第二种方式。

主程序通过一个子线程使用 subprocess.Popen() 调用打包为单个文件的更新程序。

然后更新程序再核对一遍是否存在版本更新,如果存在更新,那么继续请求远程服务器,下载新版本的程序。

程序文件的下载,我们可以直接使用 requests 模块,示例代码如下所示:

def work(self):
# 新建一个文件对象
temp_file = os.path.join(self.download_path,'update.zip') # 指定更新包下载的路径
logger.info("下载临时文件路径为:{}".format(temp_file))
with open(temp_file,'wb') as self.fileobj:
# 请求更新文件包
f = requests.get(self.download_url, stream=True)
# 写入文件
offset = 0
for chunk in f.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
# logger.info("写入块:{},{}".format(offset,proess))
self.download_proess_signal.emit(int(proess))

解压覆盖

新版本的程序下载完,我们就需要将其解压到原有的文件夹了。这时候,更新程序和主程序分开打包的好处就出来了,我们通过更新程序将正在运行的主程序进程结束掉,然后将新版本的程序压缩包解压覆盖现有程序所在的文件夹:

def work(self):
# 1.杀死主程序进程
for proc in psutil.process_iter():
if proc.name() == 'xxx.exe':
proc.kill()
# 2.获取程序本地路径
current_path = os.path.dirname(os.path.abspath(__file__))
logger.info("当前程序路径:{}".format(current_path))
# 3.解压新版本压缩包到程序本地路径
update_file_path = os.path.join(self.download_temp_path, 'update.zip')
shutil.unpack_archive(
filename=update_file_path,
extract_dir=current_path
)
# 4.删除临时文件夹和文件
os.remove(update_file_path)
shutil.rmtree(self.download_temp_path)

这样,我们就实现了Python编写的桌面图形界面程序的更新检测、下载和覆盖安装。

Python编写的桌面图形界面程序实现更新检测和下载安装的更多相关文章

  1. python使用easygui写图形界面程序

    我 们首先下载一个类库easygui,它是一个Python用于简单开发图形化界面的类库,打开easygui的下载网页 http://sourceforge.net/projects/easygui/? ...

  2. 在桌面Linux环境下开发图形界面程序的方案对比

    在Linux下开发GUI程序的方法有很多,比如Gnome桌面使用GTK+作为默认的图形界面库,KDE桌面使用Qt作为默认的图形界面库,wxWidgets则是另一个使用广泛的图形库,此外使用Java中的 ...

  3. linux启动后自动登录并运行自定义图形界面程序

    在<Ubuntu CTRL+ALT+F1~F6 进入命令模式后不支持中文显示的解决办法>一文中提到linux启动在以后运行一个独占显示器的图形程序的两种办法. 1.不启动xserver,使 ...

  4. 在ubuntu上使用wxWidgets成功开发一个图形界面程序

    编译wxWidgets 下载最新版的源码,wxWidgets-3.0.2.wxWidgets在liunx是通过wxGTK实现的.wxGTK和wxWidgets的源码打包在一起.wxGTK依赖GTK+, ...

  5. Quartz(GUI)图形界面程序----Quartz Web

    下载.设置和运行Quartz(GUI)图形界面程序----Quartz Web 一.获取Quartz Web程序(Quartz GUI).早期的 Quartz 框架开发者意识到一个 GUI 对于某类用 ...

  6. 用Python编写简单的发红包程序和计算器原理

    用Python编写简单的发红包程序: 第一种解法:数轴方法解决 import random def red_packet(money,num): money = money * 100 #将钱数转换成 ...

  7. Win32简单图形界面程序逆向

    Win32简单图形界面程序逆向 前言 为了了解与学习底层知识,从 汇编开始 -> C语言 -> C++ -> PE文件 ,直至今天的Win32 API,着实学的令我头皮发麻(笑哭). ...

  8. 第十五章 使用PyQt进行Python图形界面程序开发

    在基础知识部分的最后一章<第十三章 Python基础篇结束章>的<第13.3节 图形界面开发tkinter>简单介绍了Python内置图形界面标准库tkinter,当时特别强调 ...

  9. 使用PyQt进行Python图形界面程序开发文章目录

    ☞ ░ 前往老猿Python博文目录 ░ PyQt入门知识原来是作为老猿Python<Python基础教程目录>后的进阶学习章节存在,最近不少专栏作者提醒老猿整体的博文内容不错,但博文没有 ...

随机推荐

  1. STM32的启动方式

    STM32三种启动模式对应的存储介质均是芯片内置的,它们是: 1. 用户闪存=芯片内置的Flash. 2. SRAM=芯片内置的RAM区,就是内存啦. 3. 系统存储器system memory=芯片 ...

  2. java 面向对象(三十七):反射(一) 反射的概述

    1.本章的主要内容 2.关于反射的理解 Reflection(反射)是被视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属 ...

  3. scrapy 基础组件专题(七):scrapy 调度器、调度器中间件、自定义调度器

    一.调度器 配置 SCHEDULER = 'scrapy.core.scheduler.Scheduler' #表示scrapy包下core文件夹scheduler文件Scheduler类# 可以通过 ...

  4. java 数据结构(六):数组与集合

    1. 集合与数组存储数据概述:集合.数组都是对多个数据进行存储操作的结构,简称Java容器.说明:此时的存储,主要指的是内存层面的存储,不涉及到持久化的存储(.txt,.jpg,.avi,数据库中) ...

  5. 数据可视化之PowerQuery篇(十九)PowerBI数据分析实践第三弹 | 趋势分析法

    https://zhuanlan.zhihu.com/p/133484654 ​本文为星球嘉宾"海艳"的PowerBI数据分析工作实践系列分享之三,她深入浅出的介绍了PowerBI ...

  6. freeMarker随手笔记

    freemarker官网:http://docs.freemarker.cn/ 注意: 1.如果标签没有嵌套内容(在开始标签和结束标签之间的内容),那么可以只使用开始标签 (详情:http://fre ...

  7. DVWA(xss部分源码分析)

    前言 DVWA靶场都不陌生,最新学习xss,从新又搞了一遍xss部分,从源码方面康康xss的原因,参考了很多大佬的博客表示感谢,网上也有很多DVWA靶场教程,就水一篇吧. 更多web安全知识欢迎访问: ...

  8. 实践使用nodejs获取用户真实IP?

    先上代码 var http = require('http') var server = http.createServer(function (req,res) { console.log(req. ...

  9. “git pull” 强制覆盖本地文件

    放弃本地修改,使用服务器代码覆盖本地的Git命令如下: $ git fetch --all $ git reset --hard origin/master $ git pull 使用master分支 ...

  10. Zookeeper集群部署及报错分析

    安装 下载压缩包 解压 修改zoo.cfg文件 创建myid文件 启动 自启动配置 有时间再补hhh 报错处理 很荣幸的遇到了大部分报错,日志再zookeeper目录的bin下的zookeeper.o ...