tkinter-TinUI-xml实战(12)pip可视化管理器

news/2024/8/28 4:55:05/ 标签: python, tkinter, TinUI

引言

pip命令行工具在平常使用方面确实足够简单,本项目只是作为TinUI多界面开发的示例。

当然,总有人想用GUI版pip,实际上也有。不过现在,我们就来手搓一个基于pythonTinUItkinter)的pip可视化管理器。

命名为“pip集合功能平台”:Pip Integration Platform(PIP)

没错,我就是故意的。

项目开源地址:Github · Pip Integration Platform。

文件结构

│  gui.py 界面控制
│  main.py 主程序
│  pipmode.py pip功能控制
│  TinUI.py UI支持
│
├─lib
│  ├─gui 三个界面
│  │  │  gui_install.py
│  │  │  gui_list.py
│  │  │  gui_uninstall.py
│  │
│  └─operate pip功能的具体实现
│      │  pip_install.py
│      │  pip_list.py
│      │  pip_uninstall.py
│
├─pages 页面设计
│      main.xml
│      p1_libs.xml
│      p2_install.xml
│      p4_uninstall.xml

结构说明见PIP程序结构。

页面设计

无论最终结果是什么样,先把能够看的搭建起来。本项目的四个界面均使用TinUI库自带的TinUIXml编辑器。

main.xml为简单的标签页控件,这里不展示。

p1_libs.xml

<!--TinUIXml编辑器-->
<tinui><line><listbox width='760' height='460' data='("TinUI",)' command='self.funcs["sel_libs"]'>lsbox</listbox></line><line><button2 text='打开文件位置' command='self.funcs["opendoc"]'></button2><button2 text='打开项目页面' command='self.funcs["pypidoc"]'></button2><button2 text='卸载' command='self.funcs["uninstall"]'></button2><button text='检测全部可更新项目' command='self.funcs["update"]'></button></line>
</tinui>

在这里插入图片描述
p2_install.xml

<!--TinUIXml编辑器-->
<tinui><line y='20' anchor='w'><paragraph text='第三方库名:'></paragraph><entry width='300'>entry</entry><checkbutton text='升级' command='self.funcs["update_switch"]'>check</checkbutton><button2 text='开始安装' command='self.funcs["install"]'>button</button2></line><line><textbox width='760' height='480' scrollbar='True'>textbox</textbox></line>
</tinui>

在这里插入图片描述

p4_uninstall.xml

<!--TinUIXml编辑器-->
<tinui><line y='20' anchor='w'><paragraph text='要卸载的库:'></paragraph><entry width='300'>entry</entry><button2 text='开始卸载' command='self.funcs["uninstall2"]'>button</button2></line><line><textbox width='760' height='480' scrollbar='True'>textbox</textbox></line>
</tinui>

在这里插入图片描述

界面交互

PIP的总界面管理见gui.py。

各项功能界面见PIP的lib.gui.*。

子线程运行pip命令

因为pip命令大多为耗时命令,因此在PIP中,pip命令将被放置在子线程中运行,在运行结束后会调用回调函数并触发窗口事件,结束子线程并在界面线程中展示操作结果。

这种做法不仅不会阻碍界面线程,还能够在界面线程实时显示命令行输出信息。以安装(install)功能为例。

gui_install.py

python">#...update=False#是否升级,用于调整pip参数
update_page=False#升级检测页面是否打开
update_page_id=None#升级检测页面对应到TinUI.notebook的页面id
book=None#标签页控件
ui=None#标签页中对应的BasicTinUI#...
def install():#开始下载(执行pip命令,不判断正误)name=entry.get()entry.disable()check.disable()button.disable()pipmode.install(update,name,add_msg,end)def add_msg(_msg:str):#接受pip_install的信息global msgmsg=_msgtextbox.event_generate('<<NewMsg>>')
def _add_msg(e):#接受pip_install调用add_msg传递的信息textbox.config(state='normal')textbox.insert('end',msg)textbox.see('end')textbox.config(state='disabled')def end():#接受pip_install停止操作textbox.event_generate('<<End>>')
def _end(e):#操作结束,按钮恢复entry.normal()check.active()button.active()textbox.config(state='normal')textbox.insert('end','====================\n\n')textbox.config(state='disabled')#...

pip_install.py

python">"""
/lib/operate/pip_install.py
升级和安装的第三方库
"""
import subprocess
import threadingdef __install(update,name,msgfunc,endfunc):if update:#已安装,升级cmd="pip install --upgrade "+nameelse:#安装cmd="pip install "+namemsgfunc(cmd+'\n')result=subprocess.Popen(cmd,stdout=subprocess.PIPE,stderr=subprocess.STDOUT,shell=True)for line in iter(result.stdout.readline, b''):msgfunc(line.decode('utf-8'))endfunc()def install(update,name,msgfunc,endfunc):thread = threading.Thread(target=__install,args=(update,name,msgfunc,endfunc,))thread.setDaemon(True)thread.start()

可以看到,界面按钮通过pipmode.py调用了lib.operate.pip_installinstall方法,创建了一个名为thread的线程并在其中运行pip命令。

我们注意__install方法中,存在msgfunc(...)endfunc(...)的回调,再看看gui_install.py中对应的add_msg(...)end(..)方法。我们着重看add_msg方法,其中只进行了两步,第一步是将返回值变为全局变量,本进程公用;第二步触发界面的虚拟事件<<NewMsg>>,后续步骤脱离子线程,而子线程一直运行,直到回调endfunc(...)

这个时候,因为虚拟事件被触发,gui_install.py在主线程开始运行_add_msg方法,实现对信息流的GUI展示。

各项pip功能见PIP的lib.operate.*。

子线程回调见PIP的多线程回调方式。

效果

初始化

在这里插入图片描述

安装

在这里插入图片描述

更新

检测更新是一个漫长的过程。

在这里插入图片描述

返回库列表点击按钮只是为了展示界面线程运行正常。

在这里插入图片描述

卸载

在这里插入图片描述

结语

这就是我们手搓的一个简易pip功能集合平台。

详细内容见开源项目地址:Github · Pip Integration Platform。


http://www.ppmy.cn/news/1475934.html

相关文章

【闲聊】-Perl的基础语法

Perl语言详细介绍 概述 Perl&#xff0c;全称“Practical Extraction and Report Language”&#xff0c;是一种功能强大的编程语言&#xff0c;特别擅长文本处理和系统自动化任务。它最初由Larry Wall于1987年设计&#xff0c;旨在解决UNIX系统管理中的常见问题&#xff0c;…

【Java EE】统一功能返回

一、拦截器 1.1 拦截器的作用 在对于数据库进行增删查改的时候&#xff0c;如果当前页面不检查用户是否登录&#xff0c;然后就能操作成功是不合理的&#xff0c;解决方法有两个&#xff1a; 对于已经写好的每个接口都加上一个判断&#xff0c;从Session中获取用户信息&…

嵌入式物联网在教育行业的应用——案例分析

作者主页: 知孤云出岫 嵌入式物联网在教育行业的应用——案例分析 目录 作者主页:嵌入式物联网在教育行业的应用——案例分析一、引言二、智能教室&#xff1a;环境监测系统1. 硬件需求2. 电路连接3. 代码实现 三、个性化学习&#xff1a;智能学习平台1. 数据处理与分析2. 代…

【多线程】单例模式

&#x1f970;&#x1f970;&#x1f970;来都来了&#xff0c;不妨点个关注叭&#xff01; &#x1f449;博客主页&#xff1a;欢迎各位大佬!&#x1f448; 文章目录 1. 单例模式的初识2. 单例模式的含义3. 单例模式实现的两种方式3.1 饿汉模式3.2 懒汉模式3.2.1 懒汉模式(单线…

Go Web开发框架之Gin

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

安装adb和常用命令

下载ADB安装包 https://dl.google.com/android/repository/platform-tools-latest-windows.zip 解压安装包 解压如上下载的安装包&#xff0c;然后复制adb.exe所在的文件地址 配置环境变量 我的电脑——>右键属性——>高级系统设置——>环境变量——>系统变量—…

MySQL字符串魔法:拼接、截取、替换与定位的艺术

在数据的世界里&#xff0c;MySQL作为一把强大的数据处理利剑&#xff0c;其字符串处理功能犹如魔术师手中的魔法棒&#xff0c;让数据变换自如。今天&#xff0c;我们就来一场关于MySQL字符串拼接、截取、替换以及查找位置的奇幻之旅&#xff0c;揭开这些操作的神秘面纱。 介绍…

MVC、MVP和MVVM这三种设计模式的区别

详谈MVC、MVP 和 MVVM MVC、MVP 和 MVVM 这三种设计模式的区别1. 角色职责2. 数据绑定3. 性能和可测试性4. 复杂性5. 技术依赖6. 综合比较 总结如何选择 MVC、MVP 和 MVVM 这三种设计模式的区别 1. 角色职责 MVC 模型&#xff08;Model&#xff09;&#xff1a;负责数据处理和…

VGMShield:揭秘视频生成模型滥用的检测与追踪技术

人工智能咨询培训老师叶梓 转载标明出处 视频生成模型&#xff0c;如 Stable Video Diffusion 和 Videocrafter&#xff0c;已经能够生成合理且高分辨率的视频。但这些技术进步也带来了被恶意利用的风险&#xff0c;比如用于制造假新闻或进行政治宣传。因此&#xff0c;来自弗…

RPC 的原理和示例

RPC&#xff08;远程过程调用&#xff09;是一种在不同计算机之间进行通信的技术&#xff0c;使得程序可以请求远程服务器上的服务就像调用本地服务一样。RPC抽象了网络通信的细节&#xff0c;让开发者能够更专注于实现业务逻辑。 为什么使用RPC&#xff1f; 抽象化通信过程&…

Facebook Research 的 Ocean 框架用于AR和CV的C++库

Ocean 是一个为各种任务设计的组件和库的集合,包括计算机视觉、几何、媒体处理、网络和渲染。以下是对Ocean框架的主要内容的简要概述: 主要目录结构 build/:不同构建系统的构建配置。doc/:包含各种文档。impl/:包含所有源代码。res/:包含所有资源文件,主要用于构建应用…

【嵌入式DIY实例-ESP8266篇】-LCD ST7789显示DS1307 RTC时间数据

LCD ST7789显示DS1307 RTC时间数据 文章目录 LCD ST7789显示DS1307 RTC时间数据1、硬件准备与接线2、代码实现本文将介绍如何使用 ESP8266 NodeMCU 板和 DS1307 RTC 集成电路构建简单的实时时钟和日历 (RTCC),其中时间和日期打印在 ST7789 TFT 显示模块上。 ST7789 TFT 模块包…

服务器系统盘存储不够,添加数据盘并挂载(阿里云)

目录 1.获取数据盘设备名称 2.为数据盘创建分区 3.为分区创建文件系统 4.配置开机自动挂载分区 阿里云数据盘挂载说明链接&#xff1a;在Linux系统中初始化小于等于2 TiB的数据盘_云服务器 ECS(ECS)-阿里云帮助中心 1.获取数据盘设备名称 sudo fdisk -lu 运行结果如下所示…

大模型产品视图一览

大模型产品视图&#xff0c;第一眼看上去很眼熟&#xff0c;直接让我想了CNCF的Cloud Native Landscape&#xff0c;不信你来对比看看。 视图地址&#xff1a;https://llm.juejin.cn/view 使用 左侧提供筛选功能&#xff0c;每个产品都有详细对应的产品详情使用&#xff0c;可…

Javassist 修改 jar 包里的 class 文件

前言 Javassist 是一个用于处理 Java 字节码的类库&#xff0c;可以用以修改 class 文件或 jar 包里的 class 文件。 简单来说我们用Java编写的代码是放在 java 格式的代码文件里&#xff0c;在编译的时候会编译为 class 格式的字节码文件&#xff0c;然后一般所有 class 文件…

深度加速器 国服外服游戏加速器

深度加速器功能用途 1.国内手游加速&#xff0c;选择国内延时低的节点&#xff0c;智能加速 能解决的问题&#xff1a;丢包、延迟、游戏掉线、联机困难&#xff1b; 2.网页加速 能解决的问题&#xff1a;网页加载、跳转缓慢、访问限制问题&#xff1b; 3.适用于浏览资讯、…

捷配笔记-混合信号PCB布局设计的基本准则是什么?

混合信号PCB设计需要对模拟和数字电路有基本的了解&#xff0c;以最大限度地减少&#xff08;如果不能防止的话&#xff09;信号干扰。现代系统由数字域和模拟域均可操作的组件组成&#xff0c;这些组件必须经过精心设计&#xff0c;以确保整个系统的信号完整性。 在混合信号系…

SpringBoot如何使用Kafka来优化接口请求的并发

在Spring Boot中使用 Kafka 来优化接口请求的并发&#xff0c;主要是通过将耗时的任务异步化到Kafka消息队列中来实现。这样&#xff0c;接口可以立即响应客户端&#xff0c;而不需要等待耗时任务完成。 在Spring Boot应用程序中调用Kafka通常涉及使用Spring Kafka库&#xff…

ubuntu 换源

sudo apt update 错误如下 Ign:1 http://security.ubuntu.com/ubuntu focal-security InRelease Ign:2 http://us.archive.ubuntu.com/ubuntu focal InRelease Err:3 http://security.ubuntu.com/ubuntu focal-security Release SECURITY: URL redirect target…

flutter 手写 TabBar

前言&#xff1a; 这几天在使用 flutter TabBar 的时候 我们的设计给我提了一个需求&#xff1a; 如下 Tabbar 第一个元素 左对齐&#xff0c;试了下TabBar 的配置&#xff0c;无法实现这个需求&#xff0c;他的 配置是针对所有元素的。而且 这个 TabBar 下面的 滑块在移动的时…