实现pyqt5开发的应用程序在线更新功能

有一个需求:
因为软件在不断更新,需要客户所使用的的客户端软件,能够自动检测版本更新,并在客户允许的情况下自动进行文件的下载和安装

主要步骤有以下:
1、客户端软件开发一个模块,以独立线程的形式在主程序启动时进行检测,判断是否有新版本,如果有,在主界面以弹窗的形式告知用户
2、搭建一个服务器,提供版本检测和最新版本软件下载的功能
3、编写一个单独的更新程序,主程序调用更新程序进行下载并更新
具体步骤可参考链接:https://toutiao.io/posts/okj44ae/preview
一、客户端检测:

import requests
import os

sm_version = '1.5.3'    
# 检查客户端版本
def check_update():
    try:
        url = 'http://127.0.0.1/version'
        resp = requests.get(url)
        resp.encoding = 'UTF-8'
        if resp.status_code != 200:
            print('【版本检测】服务器连接失败')
            return False
        if resp.text == c_version:
            print('【版本检测】客户端版本正常')
            return True
        print('【版本检测】客户端版本过低,启动自动更新程序?')
    except Exception as e:
        print('【版本检测】网络错误')
        return False
 
# 开始运行
check_update()

二、服务器部署

from flask import Flask, request, send_file

n_version = '1.5.3'
app = Flask(__name__)

# 版本查询
@app.route('/version', methods=['GET'])
def get_version():
    return n_version

# http://192.168.71.27:80/version
# 获取最新文件
@app.route('/update/app', methods=['GET'])
def update_app():
    # 新版本文件路径
    file_path = "G:/软件源文件/{}.ppt".format("有个性的羊")
    return send_file(file_path)
    
if __name__ == '__main__':
    app.run(host='0.0.0.0', port=80, debug=False)

三、第三方更新程序

import os
import shutil

import psutil
import requests


class third_update:
	def down(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)
if __name__ == '__main__':
    tp = third_update()
    tp.down()
    tp.work()

  • 0
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个使用pyqt5开发的桌面应用实现在线升级的代码示例: ```python import sys import os import requests from PyQt5.QtWidgets import QApplication, QMainWindow, QMessageBox, QProgressBar, QPushButton from PyQt5.QtCore import QThread, Qt, pyqtSignal class UpdateThread(QThread): update_progress = pyqtSignal(int) def __init__(self, url, dest): super().__init__() self.url = url self.dest = dest def run(self): response = requests.get(self.url, stream=True) total_size = int(response.headers.get('content-length', 0)) block_size = 1024 progress = 0 with open(self.dest, 'wb') as f: for data in response.iter_content(block_size): progress += len(data) f.write(data) self.update_progress.emit(int(progress / total_size * 100)) class MainWindow(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("在线升级示例") self.resize(300, 100) self.progress_bar = QProgressBar(self) self.progress_bar.setGeometry(10, 10, 280, 20) self.progress_bar.setValue(0) self.update_button = QPushButton(self) self.update_button.setGeometry(10, 40, 280, 30) self.update_button.setText("检查更新") self.update_button.clicked.connect(self.check_update) def check_update(self): url = 'http://example.com/app/latest.tar.gz' dest = 'latest.tar.gz' update_thread = UpdateThread(url, dest) update_thread.update_progress.connect(self.update_progress) update_thread.start() def update_progress(self, progress): self.progress_bar.setValue(progress) if progress == 100: QMessageBox.information(self, "提示", "更新完成,请重启应用。") os.execl(sys.executable, os.path.abspath(__file__), *sys.argv[1:]) if __name__ == '__main__': app = QApplication(sys.argv) window = MainWindow() window.show() sys.exit(app.exec_()) ``` 这个示例中,我们创建了一个`UpdateThread`线程,用于下载最新版本的应用程序。在`MainWindow`窗口中,我们创建了一个`QProgressBar`进度条,用于显示下载进度,并创建了一个`QPushButton`按钮,用于触发检查更新操作。当用户点击检查更新按钮时,程序会启动`UpdateThread`线程并开始下载最新版本的应用程序。同时,我们使用`update_progress`信号将下载进度传递给主线程,并在主线程中更新进度条。当下载完成时,程序会弹出一个提示框告诉用户更新已完成,并要求用户重启应用程序以完成更新。最后,我们使用`os.execl`函数重启应用程序,以使用最新版本的程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值