【教程】Tkinter实现Python软件自动更新与提醒

2023-11-05

转载请注明出处:小锋学长生活大爆炸[xfxuezhang.cn]

文件下载:https://download.csdn.net/download/sxf1061700625/88134425

示例演示:

参考代码:

import os
import _thread
import shutil
import subprocess
import sys
import requests
from tkinter import Tk, Label, IntVar, DoubleVar, HORIZONTAL, messagebox
from tkinter.ttk import Progressbar
import pyautogui



class SoftUpdateDialog:
    def __init__(self, soft_version):
        self.soft_update_url = 'http://xfxuezhang.cn/web/share/version/update_demo'
        self.soft_version = soft_version


    def init_ui(self, root):
        self.root = root
        self.root.title('软件更新')
        self.root.geometry('300x100')
        self.progress_var = IntVar()
        self.label_var = DoubleVar()
        self.label_var.set(0.0)
        label = Label(self.root, text='正在更新软件,请等待···')
        label.pack(pady=5)

        self.progress_bar = Progressbar(self.root, length=200, mode='indeterminate')
        self.progress_bar.pack(pady=5)



    def tip_show(self, msg):
        """消息提示"""
        messagebox.showwarning('提示', msg)

    def soft_download_with_thread(self):
        '''开线程下载'''
        # 下载txt文件
        url = self.soft_update_url
        try:
            req = requests.get(url, stream=True, verify=False)
        except Exception:
            self.tip_show('请检查网络设置,无法检测到网络连接')
            return
        if req is None or str(req.status_code) != '200':
            self.tip_show('软件更新失败,请检查网络设置,无法检测到网络连接')
            return
        json_result = req.json()

        # 版本比对
        latest_version = json_result['soft_version']
        latest_soft_url = json_result['soft_url']
        if self.compare_version(latest_version):
            # 下载进度工具条
            self.progress_var.set(0)
            self.progress_bar.start(60)

            # self._soft_download(latest_soft_url, latest_version)
            # 软件下载线程
            _thread.start_new_thread(self._soft_download, (latest_soft_url, latest_version))


    def check_version(self):
        url = self.soft_update_url
        try:
            req = requests.get(url, stream=True, verify=False)
        except Exception:
            self.tip_show('请检查网络设置,无法检测到网络连接')
            return
        if req is None or str(req.status_code) != '200':
            self.tip_show('软件更新失败,请检查网络设置,无法检测到网络连接')
            return
        json_result = req.json()

        # 版本比对
        latest_version = json_result['soft_version']
        return self.compare_version(latest_version)


    def _update_progressbar(self):
        '''更新进度条'''
        self.progress_bar['value'] = self.label_var.get()

    def _end_update(self):
        '''结束更新'''
        self.progress_bar.stop()
        self.root.destroy()
        
        

    def get_remote_file_size(self, url, proxy=None):
        """通过content-length头获取远程文件大小"""
        try:
            req = requests.head(url, proxies={'http': proxy, 'https': proxy} if proxy else None, verify=False)
            fileSize = int(req.headers.get('Content-Length', 0))
            return fileSize
        except Exception:
            return 0

    def _soft_download(self, latest_url, latest_version):
        '''软件下载'''
        self.label_var.set(0.0)
        lastest_name = os.path.basename(latest_url)
        lastest_size = self.get_remote_file_size(latest_url)

        start_size = 0
        with requests.get(latest_url, stream=True, verify=False) as r:
            with open(lastest_name, "wb") as f:
                for chunk in r.iter_content(chunk_size=1024):
                    if not chunk:
                        continue
                    start_size += len(chunk)
                    f.write(chunk)
                    f.flush()
                    self.label_var.set(100.0 * start_size / lastest_size)
        
        print('>> ok')
        self._end_update()

    def compare_version(self, latest_version):
        return int(self.soft_version.replace('.', '')) < int(latest_version.replace('.', ''))


if __name__ == '__main__':
    app = Tk()
    app.geometry('0x0')
    soft_dialog = SoftUpdateDialog(soft_version='0.0.5')
    
    if soft_dialog.check_version() and pyautogui.confirm(text='有新版本,是否更新', title='通知', buttons=['OK', 'Cancel'])=='OK':
        soft_dialog.init_ui(root=app)
        soft_dialog.soft_download_with_thread()
        app.mainloop()
        pyautogui.alert(text='下载完成!', title='通知', button='好的									
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【教程】Tkinter实现Python软件自动更新与提醒 的相关文章

随机推荐

  • 如何在 Ubuntu 12.04 LTS(精确穿山甲)上安装 nginx

    Status 已弃用 本文介绍不再受支持的 Ubuntu 版本 如果您当前运行的服务器运行 Ubuntu 12 04 我们强烈建议您升级或迁移到受支持的 Ubuntu 版本 升级到Ubuntu 14 04 从 Ubuntu 14 04 升级
  • R 中的 head() 和 tail() 函数 - 详细参考

    The R 中的 head 和 tail 函数通常用于读取数据集的前 n 行和后 n 行 您可能是一名在职专业人员 程序员或新手 但有时您需要阅读大型数据集并对其进行分析 消化一个拥有 20 多列甚至更多列 数千行的庞大数据集确实很困难 本
  • NoSQL 数据库管理系统和模型的比较

    介绍 当大多数人想到数据库时 他们通常会想到传统的关系数据库模型 其中涉及由行和列组成的表 虽然关系数据库管理系统仍然处理互联网上的大部分数据 但近年来 随着开发人员寻求解决关系模型局限性的方法 替代数据模型变得更加普遍 这些非关系数据库模
  • 理解 JavaScript 中的类

    介绍 JavaScript 是一种基于原型的语言 JavaScript 中的每个对象都有一个隐藏的内部属性 称为 Prototype 可用于扩展对象属性和方法 您可以在我们的文章中阅读有关原型的更多信息了解 JavaScript 中的原型和
  • 如何在角度测试中使用 Spies

    介绍 茉莉花间谍用于跟踪或存根函数或方法 间谍是一种检查函数是否被调用或提供自定义返回值的方法 我们可以使用间谍来测试依赖于服务的组件 并避免实际调用服务的方法来获取值 这有助于使我们的单元测试专注于测试组件本身的内部而不是其依赖项 在本文
  • Java 棘手面试问题

    不久前我写过一篇文章前 50 个 Java 编程问题 我们的读者非常喜欢它 所以今天我们将研究一些 Java 面试中棘手的问题 Java 棘手面试问题 这些都是编程问题 但除非您对 Java 有深入的了解 否则很难猜测输出并解释它 1 Nu
  • 了解 JavaScript 中的原型和继承

    介绍 JavaScript 是一个基于原型的语言 这意味着对象属性和方法可以通过具有克隆和扩展能力的通用对象来共享 这称为原型继承 与类继承不同 在流行的面向对象编程语言中 JavaScript 相对独特 因为 PHP Python 和 J
  • 如何在 Python 3 中使用列表方法

    介绍 Python 3 有许多内置数据结构 包括列表 数据结构为我们提供了一种组织和存储数据的方法 我们可以使用内置方法来检索或操作该数据 为了充分利用本教程 您应该熟悉列表数据类型 其语法及其索引方式 您可以通过阅读教程来查看列表理解 P
  • Mockito 教程

    Mockito 是一个基于 java 的模拟框架 与其他测试框架结合使用 例如JUnit and TestNG 它内部使用Java反射API 并允许创建服务对象 模拟对象返回虚拟数据并避免外部依赖 它通过模拟外部依赖项并将模拟应用到被测代码
  • Linux 中的存储术语和概念简介

    介绍 Linux 拥有强大的系统和工具来管理硬件设备 包括存储驱动器 在本文中 我们将从高层次上介绍 Linux 如何表示这些设备以及如何将原始存储转化为服务器上的可用空间 什么是块存储 块存储是 Linux 内核中块设备的另一个名称 A块
  • JPA EntityManager - Hibernate EntityManager

    JPA EntityManager 是 Java Persistence API 的核心 休眠是使用最广泛的 JPA 实现 JPA实体管理器 程序最重要的方面之一是与数据库的连接 数据库连接和与数据库的事务被认为是最昂贵的事务 ORM 在这
  • Apache Spark 示例:Java 中的字数统计程序

    阿帕奇火花 Apache Spark 是一个开源数据处理框架 可以在分布式环境中对大数据执行分析操作 这是加州大学伯克利分校的一个学术项目 最初由加州大学伯克利分校 AMPLab 的 Matei Zaharia 于 2009 年启动 Apa
  • 如何配置 NTP 以在 Ubuntu 16.04 上的 NTP 池项目中使用

    介绍 准确的计时对于几乎所有服务或软件都至关重要 电子邮件 记录器 事件系统和调度程序 用户身份验证机制以及在分布式平台上运行的服务都需要准确的时间戳来按时间顺序记录事件 这些服务使用网络时间协议 NTP 将系统时钟与可信的外部源同步 该源
  • 如何在 Ubuntu 16.04 上添加交换空间

    介绍 提高服务器响应能力和防止应用程序内存不足错误的最简单方法之一是添加一些交换空间 在本指南中 我们将介绍如何将交换文件添加到 Ubuntu 16 04 服务器 什么是互换 Swap是硬盘驱动器上的一个区域 被指定为操作系统可以临时存储
  • Spring 控制器 - Spring MVC 控制器

    Spring Controller 注解是一个特化 成分注解 Spring Controller 注解通常与基于 RequestMapping 注解的带注解的处理程序方法结合使用 弹簧控制器 Spring Controller 注解只能应用
  • Swift readLine()、Swift print()

    In this tutorial we ll be discussing how to read the standard input in Swift from the user and the different ways to pri
  • oracle 查看 、创建、删除 dblink

    查看方法 1 执行select from dba db links 语句 2 在PL SQL中 在左边浏览器中点击database links就可以看到数据库链路了 创建Create database link语句 create publi
  • 第一章 MATLAB 环境

    1 用户界面概述 1 1 MATLAB 的启动与其它 Windows 程序一样 点击开始 程序 找到 MATLAB 文件夹 点击它就会看几项 取决于你的安装 但至少有如下几项 1 MATLAB 版本号 2 Mfifile editor 3
  • C++57个入门知识点_25 new与delete(对于对象: new创建时先分配堆内存后调用构造函数,delete先调用析构,后释放堆空间;malloc和free只是堆内存操作,不会调用构造和析构)

    本篇开始我们将学习C语言中没有 C 中常用的运算符new及delete C 57个入门知识点 22 构造函数和析构函数的调用时机 可手动调用构造和析构 访问权限一般为公有 局部对象声明时构造 出作用域析构 全局对象主函数前构造 出主函数后析
  • 【教程】Tkinter实现Python软件自动更新与提醒

    转载请注明出处 小锋学长生活大爆炸 xfxuezhang cn 文件下载 https download csdn net download sxf1061700625 88134425 示例演示 参考代码 import os import
Powered by Hwhale