Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >【教程】Tkinter实现Python软件自动更新与提醒

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

作者头像
小锋学长生活大爆炸
发布于 2023-08-02 01:43:58
发布于 2023-08-02 01:43:58
67900
代码可运行
举报
运行总次数:0
代码可运行

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

示例演示:

参考代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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='好的👌🏻')

远程服务器的文件格式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  "soft_version": "1.0.0",
  "soft_url": "http://xfxuezhang.cn/web/share/version/update_demo.exe"
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-07-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【小码匠自习室】让错误成为孩子进步的阶梯
碎碎念 今天梳理了这篇文章,同一个地方只能跌一次跟头,再重复错误肯定被老码农敲脑袋 梳理这篇文章源于3月份参加NOI Online测试赛没有全文比较输出文件内容,只是对比了几个值,导致爆零( ̄﹏ ̄;) 标题是老码农起的,心灵鸡汤太多了,以后想管他叫”唐鸡汤“了。(*^_^*) 准备测试文件 mode_ex1.ans 4 1 5 1 4 2 4 8 2 1 2 3 4 5 mode_ex1-2.ans 修改了第13行数据:4 -> 6 4 1 5 1 4 2 4 8 2 1 2 3 6 5 mode_ex
小码匠
2022/08/08
3800
Linux 命令(119)—— diff 命令
如果给定的文件名是 -,表示从标准输入读取内容。如果给定的文件是目录,则将会比较该目录中具有相同文件名的文件,默认情况下不会对其子目录文件进行任何比较操作。
恋喵大鲤鱼
2020/02/20
1.6K0
python 比较两个目录 脚本
""" ################################################################################ Usage: "python diffall.py dir1 dir2". Recursive directory tree comparison: report unique files that exist in only dir1 or dir2, report files of the same name in dir1 and dir2 with differing contents, report instances of same name but different type in dir1 and dir2, and do the same for all subdirectories of the same names in and below dir1 and dir2. A summary of diffs appears at end of output, but search redirected output for "DIFF" and "unique" strings for further details. New: (3E) limit reads to 1M for large files, (3E) catch same name=file/dir, (4E) avoid extra os.listdir() calls in dirdiff.comparedirs() by passing results here along. ################################################################################ """
用户5760343
2022/05/13
7760
Linux-diff和diff3命令
将目录/usr/li下的文件”test.txt”与当前目录下的文件”test.txt”进行比较,输入如下命令:
小小工匠
2021/08/16
1.6K0
【linux命令讲解大全】007.现代技术中的差异比较工具——diff
diff命令在最简单的情况下,用于比较给定的两个文件的不同。如果使用 “-” 代替 “文件” 参数,则要比较的内容将来自标准输入。diff命令以逐行的方式比较文本文件的异同处。如果该命令指定进行目录的比较,则将会比较该目录中具有相同文件名的文件,而不会对其子目录文件进行任何比较操作。
全栈若城
2024/03/02
4910
dig、diff命令详解
@<服务器地址>:指定进行域名解析的域名服务器; -b<ip地址>:当主机具有多个IP地址,指定使用本机的哪个IP地址向域名服务器发送域名查询请求; -f<文件名称>:指定dig以批处理的方式运行,指定的文件中保存着需要批处理查询的DNS任务信息; -P:指定域名服务器所使用端口号; -t<类型>:指定要查询的DNS数据类型; -x<IP地址>:执行逆向域名查询; -4:使用IPv4; -6:使用IPv6; -h:显示指令帮助信息。
菲宇
2019/06/13
1.2K0
git diff与linux diff的输出格式之unified format
前面有一篇文章《一个有些意思的项目--文件夹对比工具(一)》,里面简单讲了下diff算法之--Myers算法。
低级知识传播者
2022/11/16
2.1K0
git diff与linux diff的输出格式之unified format
diff命令
diff命令能够比较给定的两个文件的不同,如果使用-代替文件参数,则要比较的内容将来自标准输入,diff命令是以逐行的方式比较文本文件的异同处,如果该命令指定进行目录的比较,则将会比较该目录中具有相同文件名的文件,而不会对其子目录文件进行任何比较操作。
WindRunnerMax
2020/08/27
1.2K0
diff命令
接手别人的工作,想把一些操作集成到ansible管理,但是因为之前同事没留下任何文档,只能自己摸着石头过河。编写playbook要清楚某些配置文件做了哪些改动,使用diff命令,让类似文件比较的工作更加高效。
阿dai学长
2020/04/10
1.1K0
Linux之diff命令
原文链接:https://rumenz.com/rumenbiji/linux-diff.html
入门笔记
2021/07/22
1.6K0
Python 自动化业务服务监控
使用diffie模块实现文件内容差异对比。dmib作为 Python的标准库模块, 无需安装,作用是对比文本之间的差异,且支持输出可读性比较强的HTML文档,与 Linux 下的dif命令相似。我们可以使用 diffie对比代码、配置文件的差别,在版本控制方面是非 常有用。 Python3.x或更高版本默认自带 diffie模块,无需额外安装。
王瑞MVP
2022/12/28
4230
Linux 使用 diff 分栏对比文本差异
使用 -y 表示两列查看,使用 -W 设定宽度,这样就可以在终端里分栏查看文件差异:
宋天伦
2023/10/20
4780
Linux 使用 diff 分栏对比文本差异
linux比较两个目录的差异
原文链接:https://rumenz.com/rumenbiji/linux-compare-dir.html
入门笔记
2021/11/28
3K0
第五章:操作文件和目录
At this point, we are ready for some real work! This chapter will introducethe following commands:
砖业洋__
2023/05/06
2040
linux diff
diff 命令是 linux上非常重要的工具,用于比较文件的内容,特别是比较两个版本不同的文件以找到改动的地方。diff在命令行中打印每一个行的改动。最新版本的diff还支持二进制文件。diff程序的输出被称为补丁 (patch),因为Linux系统中还有一个patch程序,可以根据diff的输出将a.c的文件内容更新为b.c。diff是svn、cvs、git等版本控制工具不可或缺的一部分。
用户5760343
2022/05/20
1.5K0
linux每日命令(33):diff命令
diff 命令是 linux上非常重要的工具,用于比较文件的内容,特别是比较两个版本不同的文件以找到改动的地方。diff在命令行中打印每一个行的改动。最新版本的diff还支持二进制文件。diff程序的输出被称为补丁 (patch),因为Linux系统中还有一个patch程序,可以根据diff的输出将a.c的文件内容更新为b.c。diff是svn、cvs、git等版本控制工具不可或缺的一部分。
用户1214487
2018/12/24
1.5K0
[Linux][4_文件,打包和用户管理]
Linux系统中使用以下命令来查看文件的内容:     cat 由第一行开始显示文件内容     tac 从最后一行开始显示,可以看出 tac 是 cat 的倒著写!     nl 显示的时候,顺道输出行号!     more 一页一页的显示文件内容     less 与 more 类似,但是比 more 更好的是,他可以往前翻页!     head 只看头几行     tail 只看尾巴几行     wc 统计文件行数
玖柒的小窝
2021/10/23
5600
Linux常用命令
1:  shutdown [root@cairui ~]# shutdown --help Usage: shutdown [OPTION]... TIME [MESSAGE]  #使用 Bring the system down. Options: -r reboot after shutdown            #重启,也可以直接使用 reboot 命令 -h halt or power
用户1173509
2022/05/09
7530
Linux常用命令
11.Linux文件管理命令---diff比较两个文件
下面是 GNU 所接受的 diff 所有选项的概要。大多数选项有两个相同的名字,一个是单个 地跟在“-”后面的字母,另一个是由“--”引出的长名字。多个单字母选项(除非它们产生歧 义)能够组合为单行的命令行语法,-ac 等同于 -a –c。长命名的选项能被缩短到它们的名字的 任何唯一的前缀。用 和 括起来显示产生歧义的选项。
鱼多多
2025/01/03
1670
11.Linux文件管理命令---diff比较两个文件
Linux常用命令
Linux中许多常用命令是必须掌握的,这里将我学linux入门时学的一些常用的基本命令分享给大家一下,希望可以帮助你们。
鱼找水需要时间
2023/02/16
5.2K0
相关推荐
【小码匠自习室】让错误成为孩子进步的阶梯
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验