tkinter-TinUI-xml实战(12)pip可视化管理器
引言
pip命令行工具在平常使用方面确实足够简单,本项目只是作为TinUI多界面开发的示例。
当然,总有人想用GUI版pip,实际上也有。不过现在,我们就来手搓一个基于python和TinUI(tkinter)的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
#...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
"""
/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_install
的install
方法,创建了一个名为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。
相关文章:

tkinter-TinUI-xml实战(12)pip可视化管理器
引言 pip命令行工具在平常使用方面确实足够简单,本项目只是作为TinUI多界面开发的示例。 当然,总有人想用GUI版pip,实际上也有。不过现在,我们就来手搓一个基于python和TinUI(tkinter)的pip可视化管理器。…...

Java中标识符和关键字
1.标识符 public class HelloWorld{public static void main(String[] args){System.out.println("Hello,world");} }上述代码中在public class 后面的HelloWorld称为类名,main称为方法名,也可以将其称为标识符,即:在程…...

电子版pdf格式标书怎么加盖公章?
电子版PDF格式标书加盖公章的方法有多种,以下是一些常用的步骤和技巧: 一、手动插入图片法 打开PDF文档:首先,确保你已经安装了支持PDF编辑的软件,如Adobe Acrobat Reader DC、Foxit PDF Editor等。选择插入图片&…...

【开放集目标检测】Grounding DINO
一、引言 论文: Grounding DINO: Grounding DINO: Marrying DINO with Grounded Pre-Training for Open-Set Object Detection 作者: IDEA 代码: Grounding DINO 注意: 该算法是在Swin Transformer、Deformable DETR、DINO基础上…...

东莞酷得 PMS134应广8位OTP单片机
1、特性 通用 OTP 系列 不建议使用于 AC 阻容降压供电或有高 EFT 要求的应用。应广不对使用于此类应用而不达安规要求负责 工作温度范围:-20C~70C 1.2.系统特性 一个硬件 16位计数器 两个8位硬件 PWM生成器 三个11 位硬件 PWM生成器(PWMG0,PWMG1…...

[终端安全]-7 后量子密码算法
本文参考资料来源:NSA Releases Future Quantum-Resistant (QR) Algorithm Requirements for National Security Systems > National Security Agency/Central Security Service > Article Commercial National Security Algorithm Suite 2.0” (CNSA 2.0) C…...

uniapp 支付宝小程序 芝麻免押 免押金
orderStr参数如下: my.tradePay({orderStr:res, // 完整的支付参数拼接成的字符串,从 alipay.fund.auth.order.app.freeze 接口获取success: (res) > {console.log(免押成功);console.log(JSON.stringify(res),不是JOSN);console.log(JSON.stringify…...

Python爬虫教程第一篇
一、爬虫基础概念 1. 什么是爬虫 爬虫(Spider,又称网络爬虫),是指向网站/网络发起请求,获取资源后分析并提取有用数据的程序。从技术层面来说,爬虫通过程序模拟浏览器请求站点的行为,把站点返…...

AI时代:探索个人潜能的新视角
文章目录 Al时代的个人发展1 AI的高速发展意味着什么1.1 生产力大幅提升1.2 生产关系的改变1.3 产品范式1.4 产业革命1.5 Al的局限性1.5.1局限一:大模型的幻觉 1.5.2 局限二:Token 2 个体如何应对这种改变?2.1 职场人2.2 K12家长2.3 大学生2.4 创业者 3 人工智能发…...

【Python学习笔记】Optuna + Transformer B站视频实践
【Python学习笔记】Optuna Transformer 实践 背景前摇(省流可不看): 之前以泰坦尼克号数据集为案例,学习了Optuna的基本操作,为了进一步巩固知识和便于包装简历,决定找个唬人一点的项目练练手。 ————…...

【自动驾驶/机器人面试C++八股精选】专栏介绍
目录 一、自动驾驶和机器人技术发展前景二、C在自动驾驶和机器人领域的地位三、专栏介绍四、订阅需知 一、自动驾驶和机器人技术发展前景 随着人工智能、机器学习、传感器技术和计算能力的进步,自动驾驶和机器人的技术水平不断提升,使得它们更加智能、可…...

Unity中一键生成具有身体感知的虚拟人物动作
在虚拟现实(VR)和增强现实(AR)的浪潮中,如何让虚拟人物的动作更加自然、真实,已经成为一个重要课题。AI4Animation项目,一个由 Sebastian Starke 主导的开源框架,为Unity开发者提供了强大的工具集,以实现这一目标。本文…...

谷粒商城实战-25-分布式组件-SpringCloud Alibaba-Nacos配置中心-加载多配置集
文章目录 一,拆分配置集二,配置文件中配置多配置集1,引用多配置集2,验证 三,多配置集总结1,使用场景2,优先级 这一节介绍如何加载多个配置集。 大多数情况下,我们把配置全部放在一个…...

UART编程
Q:为什么使用串口前要先在电脑上安装CH340驱动? 中断的作用? 环形buffer的作用? static和valitate的作用 三种编程方式简介 也可以通过DMA方式减小CPU资源的消耗 直接把数据在SRAM内存和UART模块进行传输 ,流程: …...

C++:右值引用
右值与左值 在讲解右值引用之前,我们就需要先辨析一下左值与右值的区别。 左值 左值是一个表示数据的表达式,我们可以获取它的地址并且对其赋值,左值可以出现在赋值操作符的左边,但是右值不能。 int i 0; int* p &i; do…...

(算法)硬币问题
问题:有1元,5元,10元,50元,100元,500元的硬币各有C1,C5,C10.C50,C100,C500个。 现在要用这些硬币来支付A元,最小需要多少枚硬币? 该题使用递归算法,利用局部最优解来推导…...

如何隐藏 Ubuntu 顶部状态栏
如何隐藏 Ubuntu 顶部状态栏 Chapter1 如何隐藏 Ubuntu 顶部状态栏Chapter2 Ubuntu增大屏幕可用面积之——自动隐藏顶部状态栏Chapter3 Ubuntu18.04隐藏顶栏与侧栏 Chapter1 如何隐藏 Ubuntu 顶部状态栏 https://www.sysgeek.cn/hide-top-bar-ubuntu/ 准备工作:安…...

【C++】入门基础(引用、inline、nullptr)
目录 一.引用 1.引用的定义 2.引用的特性 3.引用的使用场景 4.const引用 5.引用和指针的区别 二.inline 三.nullptr 一.引用 1.引用的定义 引用不是新定义一个变量,而是给已经存在的变量取一个别名,编译器不会给引用变量开辟内存空间,…...

24/07/10数据结构(5.1213)链表OJ
继续练习题: 7.判断链表是不是回文结构 对于一个链表,设计一个时间复杂度O(n)空间复杂度O(1)的算法,判断是否为回文结果 给定一个链表的头指针A,返回一个bool值代表其是否为回文结构. 测试样例:1->2->2->1 返回:ture bool chkPalindrome(ListNode* A){ …...

C++ 入门基础:开启编程之旅
引言 C 是一种高效、灵活且功能强大的编程语言,广泛应用于系统软件、游戏开发、嵌入式系统、科学计算等多个领域。作为 C 语言的扩展,C 不仅继承了 C 语言的过程化编程特性,还增加了面向对象编程(OOP)的支持ÿ…...

据传 OpenAI秘密研发“Strawberry”项目
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...

简单的SQL字符型注入
目录 注入类型 判断字段数 确定回显点 查找数据库名 查找数据库表名 查询字段名 获取想要的数据 以sqli-labs靶场上的简单SQL注入为例 注入类型 判断是数字类型还是字符类型 常见的闭合方式 ?id1、?id1"、?id1)、?id1")等,大多都是单引号…...

HttpClient调用SpringBoot项目的文件上传接口实现文件上传
1.导入httpclient的jar包 这里导入了httpclient、httpmime11 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:sch…...

[leetcode]kth-smallest-element-in-a-sorted-matrix 有序矩阵中第k小元素
. - 力扣(LeetCode) class Solution { public:bool check(vector<vector<int>>& matrix, int mid, int k, int n) {int i n - 1;int j 0;int num 0;while (i > 0 && j < n) {if (matrix[i][j] < mid) {num i 1;j;…...

【经典面试题】是否形成有环链表
1.环形链表oj 2. oj解法 利用快慢指针: /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/typedef struct ListNode ListNode; bool hasCycle(struct ListNode *head) {ListNode* slow head, *fast…...

Flask 用 Redis 缓存键值对-实例
Flask 使用起 Redis 来简直就是手到擒来,比 MySQL 简单多了,不需要那么多配置,实际代码就这么多,直接复制就能用。除了提供简单实用的实例以外,本文后面还会简单介绍一下 Redis 的安装与使用,初学者也能一看…...

我的世界1.21多种服务端开服教程,原版/Forge/Fabric/Paper/Mohist...,Minecraft开服教程
Minecraft(MC)1.21版多种服务端开服教程,我的世界1.21服务器搭建教程,MC原版/Forge/Fabric/Paper/Mohist服务端搭建教程,我的世界MOD/插件服开服教程。 本教程使用 Linux系统MCSManager 面板来搭建Minecraft服务器。 …...

docker安装nginx并配置https
参考 docker安装nginx并配置https-腾讯云开发者社区-腾讯云 (tencent.com) 证书的生成 参见:SpringBoot项目配置HTTPS接口的安全访问(openssl配置)_配置接口访问-CSDN博客 步骤 1: 拉取Nginx镜像 docker pull nginx 好使的镜像如下&#x…...

永磁同步电机控制算法--基于 SVM 的无磁链环 DTC
永磁同步电机无磁链环 DTC 通过控制定子磁链交轴分量来直接控制转矩,不再要求控制磁链幅值恒定,省去了传统 DTC 中的磁链环,不仅转矩响应更快,有效抑制了转矩脉动,而且提高了电机功率因数。但无磁链环 DTC 方案仍采用传…...

如何避免在 Docker 容器中遇到 MAC 地址冲突和 IP 地址冲突的问题
在 Docker 容器中遇到 MAC 地址冲突和 IP 地址冲突的问题时,通常是由于 Docker 在分配网络资源时出现了一些问题。虽然这种情况并不常见,但仍有可能发生。以下是一些原因和可能的解决方案: 原因分析 Docker 版本问题:某些 Docke…...