Python 库管理工具 v2【python源码】

Python 库管理工具 V2

一个功能全面的 Python 库管理工具,帮助您管理、清理和迁移 Python 库,理论来说这个工具不会再更新。

主要功能

1. 库管理

  • 查看已安装库: 以树状视图显示当前 Python 环境中所有已安装的库
  • 搜索库: 快速查找特定的库
  • 删除库: 一键删除选中的库
  • 安装新库: 可通过界面安装新库,过程在独立 CMD 窗口中进行,避免界面卡死

2. 旧版本清理

  • 自动扫描 Python 版本: 自动检测系统中安装的所有 Python 版本
  • 选择清理版本: 可选择特定 Python 版本进行库清理
  • 预览库列表: 查看特定 Python 版本中已安装的库
  • 一键清理: 批量删除指定 Python 版本中的库

3. 库迁移

  • 跨版本迁移: 将一个 Python 版本中的库迁移到当前使用的 Python 版本
  • 智能过滤: 自动过滤系统库和已安装库,只迁移必要的库
  • 批量安装: 自动安装源 Python 版本中的所有第三方库

近期更新内容

  1. 新增库迁移功能:

    • 添加了"库迁移"按钮,支持将选中版本的库一键迁移至当前 Python 版本
    • 智能过滤系统基础库,避免不必要的迁移
    • 使用独立 CMD 窗口进行库安装,提高稳定性
  2. 优化旧版本检测:

    • 改进 Python 版本扫描算法
    • 支持自动检测多种 Python 版本(如 3.7、3.8、3.11、3.12 等)
    • 优化版本排序,新版本优先显示

使用说明

库管理

  1. 打开应用后默认显示"库管理"选项卡
  2. 在此页面可以查看、搜索、安装和删除库
  3. 搜索框支持按库名快速筛选
  4. 选中库后点击"删除选中"可批量删除库
  5. 在"安装新库"输入框中输入库名后点击"安装"可安装新库

旧版本清理

  1. 切换到"旧版本清理"选项卡
  2. 点击"扫描 Python 版本"按钮自动检测系统中的 Python 版本
  3. 在列表中选择要操作的 Python 版本
  4. 点击"查看库列表"可预览该版本已安装的库
  5. 点击"清理库"可一键清理该版本中的第三方库
  6. 点击"库迁移"可将该版本的库迁移至当前 Python 版本

注意事项

  1. 删除库操作不可撤销,请谨慎操作
  2. 清理旧版本库前建议先查看库列表确认
  3. 系统库(如 pip、setuptools)将被保留,不会被清理
  4. 库迁移功能会打开多个 CMD 窗口,属于正常现象

系统要求

  • 操作系统: Windows 7/8/10/11
  • Python 3.6 或更高版本
  • 管理员权限(部分操作需要)

截图

在这里插入图片描述
在这里插入图片描述

源码

import tkinter as tk
from tkinter import ttk, filedialog
import subprocess
from tkinter import messagebox
import sys
import json
import re
import os
import threading
import glob

class PackageManager:
    def __init__(self):
        self.root = tk.Tk()
        self.root.title("Python库管理器")
        self.root.geometry("1000x700")
        
        # 设置主题色
        self.style = ttk.Style()
        self.style.configure("Treeview", rowheight=25)
        self.style.configure("Custom.TFrame", background="#f0f0f0")
        self.style.configure("Custom.TButton", padding=5)
        
        # 创建主容器
        self.container = ttk.Frame(self.root, style="Custom.TFrame")
        self.container.pack(fill=tk.BOTH, expand=True, padx=15, pady=15)

        # 创建选项卡
        self.notebook = ttk.Notebook(self.container)
        self.notebook.pack(fill=tk.BOTH, expand=True)
        
        # 库管理选项卡
        self.manage_tab = ttk.Frame(self.notebook)
        self.notebook.add(self.manage_tab, text="库管理")
        
        # 清理选项卡
        self.clean_tab = ttk.Frame(self.notebook)
        self.notebook.add(self.clean_tab, text="旧版本清理")
        
        # =============== 库管理选项卡内容 ===============
        # 创建搜索框
        self.search_frame = ttk.Frame(self.manage_tab, style="Custom.TFrame")
        self.search_frame.pack(fill=tk.X, pady=(10, 10))
        
        self.search_var = tk.StringVar()
        self.search_var.trace('w', self.filter_packages)
        self.search_entry = ttk.Entry(
            self.search_frame,
            textvariable=self.search_var,
            font=('微软雅黑', 9)
        )
        self.search_entry.pack(side=tk.LEFT, fill=tk.X, expand=True)
        self.search_entry.insert(0, "搜索库名...")
        self.search_entry.bind('<FocusIn>', lambda e: self.on_entry_click())
        self.search_entry.bind('<FocusOut>', lambda e: self.on_focus_out())

        # 创建主框架
        self.main_frame = ttk.Frame(self.manage_tab)
        self.main_frame.pack(fill=tk.BOTH, expand=True)

        # 创建树状视图
        self.tree = ttk.Treeview(
            self.main_frame,
            columns=("版本", "主要用途"),
            selectmode="extended",
            style="Custom.Treeview"
        )
        self.tree.heading("#0", text="库名")
        self.tree.heading("版本", text="版本")
        self.tree.heading("主要用途", text="主要用途")
        
        # 调整列宽
        self.tree.column("#0", width=200, minwidth=150)
        self.tree.column("版本", width=100, minwidth=80)
        self.tree.column("主要用途", width=500, minwidth=300)
        
        # 添加垂直滚动条
        self.v_scrollbar = ttk.Scrollbar(
            self.main_frame,
            orient="vertical",
            command=self.tree.yview
        )
        self.tree.configure(yscrollcommand=self.v_scrollbar.set)
        
        # 添加水平滚动条
        self.h_scrollbar = ttk.Scrollbar(
            self.main_frame,
            orient="horizontal",
            command=self.tree.xview
        )
        self.tree.configure(xscrollcommand=self.h_scrollbar.set)
        
        # 布局
        self.tree.grid(row=0, column=0, sticky="nsew")
        self.v_scrollbar.grid(row=0, column=1, sticky="ns")
        self.h_scrollbar.grid(row=1, column=0, sticky="ew")
        
        self.main_frame.grid_rowconfigure(0, weight=1)
        self.main_frame.grid_columnconfigure(0, weight=1)

        # 安装库框架
        self.install_frame = ttk.Frame(self.manage_tab, style="Custom.TFrame")
        self.install_frame.pack(fill=tk.X, pady=(10, 0))
        
        # 安装库标签
        self.install_label = tk.Label(
            self.install_frame,
            text="安装新库:",
            background="#f0f0f0",
            font=('微软雅黑', 9)
        )
        self.install_label.pack(side=tk.LEFT, padx=(0, 5))
        
        # 安装库输入框
        self.install_var = tk.StringVar()
        self.install_entry = ttk.Entry(
            self.install_frame,
            textvariable=self.install_var,
            font=('微软雅黑', 9),
            width=30
        )
        self.install_entry.pack(side=tk.LEFT, padx=5)
        
        # 安装按钮
        self.install_btn = ttk.Button(
            self.install_frame,
            text="安装",
            command=self.install_package,
            style="Custom.TButton"
        )
        self.install_btn.pack(side=tk.LEFT, padx=5)

        # 按钮框架
        self.button_frame = ttk.Frame(self.manage_tab, style="Custom.TFrame")
        self.button_frame.pack(fill=tk.X, pady=(10, 0))

        self.refresh_btn = ttk.Button(
            self.button_frame,
            text="刷新列表",
            command=self.refresh_packages,
            style="Custom.TButton"
        )
        self.refresh_btn.pack(side=tk.LEFT, padx=5)

        self.delete_btn = ttk.Button(
            self.button_frame,
            text="删除选中",
            command=self.delete_selected,
            style="Custom.TButton"
        )
        self.delete_btn.pack(side=tk.LEFT, padx=5)
        
        # =============== 清理选项卡内容 ===============
        self.init_clean_tab()
        
        # 状态栏
        self.status_bar = tk.Label(
            self.container,
            text="就绪",
            bd=1,
            relief=tk.SUNKEN,
            anchor=tk.W,
            background="#f0f0f0",
            font=('微软雅黑', 9)
        )
        self.status_bar.pack(fill=tk.X, pady=(10, 0))
        
        # 存储Python版本信息的字典
        self.python_versions = {
   
   }
        
        # 刷新库列表
        self.all_packages = []
        self.refresh_packages()
        
        # 自动扫描Python版本
        self.scan_python_versions()

    def on_entry_click(self):
        if self.search_entry.get() == '搜索库名...':
            self.search_entry.delete(0, tk.END)
            self.search_entry.config(foreground='black')

    def on_focus_out(self):
        if self.search_entry.get() == '':
            self.search_entry.insert(0, '搜索库名...')
            self.search_entry.config(foreground='gray')

    def write_log(self, message):
        """写入日志到日志文本框"""
        self.log_text.insert(tk.END, f"{
     
     message}\n")
        self.log_text.see(tk.END)
        self.root.update()

    def scan_python_versions(self):
        """扫描系统中安装的Python版本"""
        self.python_info.delete(0, tk.END)
        self.python_versions.clear()
        self.write_log("开始扫描Python版本...")
        
        # 记录当前运行的Python版本
        current_python = sys.executable
        current_version = f"{
     
     sys.version_info.major}.{
     
     sys.version_info.minor}.{
     
     sys.version_info.micro}"
        self.write_log(f"当前运行的Python版本: {
     
     current_version} ({
     
     current_python})")
        
        found_versions = []
        
        # 扫描常见安装位置
        possible_locations = []
        
        # Windows常见安装位置
        for drive in ['C:', 'D:', 'E:', 'F:']:
            if os.path.exists(drive):
                # 标准安装
                possible_locations.extend(glob.glob(f"{
     
     drive}\\Python*"))
                possible_locations.extend(glob.glob(f"{
     
     drive}\\Program Files\\Python*"))
                possible_locations.extend(glob.glob(f"{
     
     drive}\\Program Files (x86)\\Python*"))
                
                # 用户安装
                possible_locations.extend(glob.glob(f"{
     
     drive}\\Users\\*\\AppData\\Local\\Programs\\Python\\Python*"))
                
                # Anaconda/Miniconda
                possible_locations.extend(glob.glob(f"{
     
     drive}\\Users\\*\\Anaconda*"))
                possible_locations.extend(glob.glob(f"{
     
     drive}\\Users\\*\\Miniconda*"))
                possible_locations.extend(glob.glob(f"{
     
     drive}\\ProgramData\\Anaconda*"))
                possible_locations.extend(glob.glob(f"{
     
     drive}\\ProgramData\\Miniconda*"))
        
        # 检查PATH环境变量中的Python
        path_dirs = os.environ.get('PATH', '').split(os.pathsep)
        for path_dir in path_dirs:
            if os.path.exists(path_dir):
                python_exes = glob.glob(os.path.join(path_dir, 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

PaceCN

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值