使用Python和wxPython开发的Windows进程管理工具

来源:这里教程网 时间:2026-02-16 11:49:15 作者:

一、背景

在日常使用 Windows 系统的过程中,我们经常会遇到需要批量管理进程的场景:

开发场景:需要快速关闭所有开发工具(IDE、数据库、服务器等)以释放系统资源游戏场景:游戏结束后需要清理游戏客户端及相关后台进程办公场景:下班时需要统一关闭办公软件(微信、钉钉、企业微信等)性能优化:清理占用资源的无用进程以提升系统性能

Windows 自带的任务管理器虽然功能强大,但在批量管理进程方面存在明显不足:

    无法保存常用的进程清理列表每次都需要手动搜索和选择进程不支持一键批量关闭多个进程无法导出/导入进程管理方案

因此,开发一个专门的进程批量管理工具变得十分必要。

二、目标

本项目旨在开发一个功能完善的 Windows 进程管理工具,具备以下核心功能:

主要目标

    进程列表展示:实时显示系统运行的所有进程及其资源占用情况搜索功能:快速定位目标进程批量管理:支持将多个进程添加到批量关闭列表一键结束:一键批量结束列表中的所有进程持久化存储:保存批量关闭列表,下次启动自动加载导入导出:支持不同场景的进程列表切换

技术目标

使用 Python 作为开发语言,保证跨平台兼容性采用 wxPython 构建图形界面,提供良好的用户体验使用 psutil 库实现进程管理功能采用 JSON 格式存储配置,便于人工编辑和版本控制

三、方法

3.1 技术选型

编程语言:Python 3.x

开发效率高,代码简洁易读拥有丰富的第三方库生态

GUI 框架:wxPython

原生外观,与 Windows 系统风格一致控件丰富,文档完善性能优秀,适合桌面应用开发

进程管理库:psutil

跨平台的系统和进程管理库提供进程枚举、信息获取、终止等完整功能API 设计优雅,易于使用

数据存储:JSON

人类可读的数据格式Python 原生支持,无需额外依赖便于手动编辑和版本控制

3.2 系统架构设计

┌─────────────────────────────────────┐
│         ProcessManagerFrame         │
│         (主窗口类)                   │
├─────────────────────────────────────┤
│  ┌──────────────┐  ┌──────────────┐ │
│  │  左侧面板     │  │  右侧面板     │ │
│  │              │  │              │ │
│  │ - 搜索框     │  │ - 保存列表   │ │
│  │ - 进程列表   │  │ - 管理按钮   │ │
│  │ - 操作按钮   │  │ - 导入导出   │ │
│  └──────────────┘  └──────────────┘ │
│                                     │
│  ┌─────────────────────────────┐   │
│  │      状态栏                  │   │
│  └─────────────────────────────┘   │
└─────────────────────────────────────┘
          │
          ├─→ psutil (进程管理)
          ├─→ JSON (数据持久化)
          └─→ wxPython (界面渲染)

3.3 核心模块设计

    进程信息采集模块:使用 psutil 获取进程信息界面展示模块:使用 wxPython 构建双面板界面搜索过滤模块:实现进程名称的模糊搜索批量管理模块:管理待关闭进程列表持久化模块:JSON 文件的读写操作进程终止模块:批量结束进程的执行逻辑

四、过程

4.1 类结构分析

整个程序围绕 ProcessManagerFrame 类展开,这是一个继承自 wx.Frame 的主窗口类:

class ProcessManagerFrame(wx.Frame):
    def __init__(self):
        super().__init__(parent=None, title='Windows 进程管理器', size=(1000, 600))

核心属性

self.config_file: 配置文件路径self.saved_processes: 保存的进程字典 {进程名: 添加时间}self.all_processes: 所有进程的列表,用于搜索功能self.process_list: 左侧进程列表控件self.saved_list: 右侧保存列表控件

4.2 界面构建详解

4.2.1 整体布局

程序采用分割窗口(SplitterWindow)实现左右分栏布局:

splitter = wx.SplitterWindow(panel)
splitter.SplitVertically(left_panel, right_panel)
splitter.SetSashPosition(600)  # 设置分割位置

这种设计的优势:

用户可以拖动分割条调整两侧宽度左右功能区域明确,符合用户使用习惯充分利用屏幕空间

4.2.2 左侧面板 - 进程监控区

搜索框设计

search_sizer = wx.BoxSizer(wx.HORIZONTAL)
self.search_box = wx.TextCtrl(left_panel, style=wx.TE_PROCESS_ENTER)
self.search_btn = wx.Button(left_panel, label='搜索', size=(60, -1))
self.clear_search_btn = wx.Button(left_panel, label='清除', size=(60, -1))

关键点:

wx.TE_PROCESS_ENTER 样式允许按回车触发搜索提供"搜索"和"清除"两个按钮,操作便捷

进程列表控件

self.process_list = wx.ListCtrl(left_panel, style=wx.LC_REPORT | wx.LC_SINGLE_SEL)
self.process_list.InsertColumn(0, 'PID', width=80)
self.process_list.InsertColumn(1, '进程名称', width=200)
self.process_list.InsertColumn(2, '内存(MB)', width=100)
self.process_list.InsertColumn(3, 'CPU%', width=80)

设计考量:

wx.LC_REPORT 风格显示详细列表wx.LC_SINGLE_SEL 限制单选,避免误操作显示 PID、名称、内存、CPU 四个关键信息列宽度根据内容类型优化

4.2.3 右侧面板 - 批量管理区

保存列表控件

self.saved_list = wx.ListCtrl(right_panel, style=wx.LC_REPORT | wx.LC_SINGLE_SEL)
self.saved_list.InsertColumn(0, '进程名称', width=200)
self.saved_list.InsertColumn(1, '添加时间', width=150)

按钮分组设计

# 第一行:核心操作
right_btn_sizer1 = wx.BoxSizer(wx.HORIZONTAL)
self.kill_all_btn = wx.Button(right_panel, label='一键批量结束', size=(120, 35))
self.kill_all_btn.SetBackgroundColour(wx.Colour(220, 53, 69))  # 红色警示
self.kill_all_btn.SetForegroundColour(wx.Colour(255, 255, 255))

# 第二行:辅助功能
right_btn_sizer2 = wx.BoxSizer(wx.HORIZONTAL)
self.export_list_btn = wx.Button(right_panel, label='导出列表')
self.import_list_btn = wx.Button(right_panel, label='导入列表')

UI/UX 设计亮点:

危险操作(批量结束)使用红色突出显示按钮分两行排列,避免界面拥挤功能分组清晰:核心操作 vs 辅助功能

4.3 核心功能实现

4.3.1 进程信息采集

def load_processes(self, filter_text=''):
    """加载当前运行的进程"""
    self.process_list.DeleteAllItems()
    self.status_text.SetLabel('正在加载进程列表...')
    
    try:
        processes = []
        for proc in psutil.process_iter(['pid', 'name', 'memory_info', 'cpu_percent']):
            try:
                info = proc.info
                processes.append({
                    'pid': info['pid'],
                    'name': info['name'],
                    'memory': info['memory_info'].rss / 1024 / 1024 if info['memory_info'] else 0,
                    'cpu': info['cpu_percent'] or 0
                })
            except (psutil.NoSuchProcess, psutil.AccessDenied):
                continue

技术细节分析

进程迭代优化

psutil.process_iter(['pid', 'name', 'memory_info', 'cpu_percent']) 只获取需要的属性,提高性能避免访问不需要的进程信息

异常处理

psutil.NoSuchProcess:进程在迭代过程中结束psutil.AccessDenied:无权限访问的系统进程这两种异常需要静默处理,不影响其他进程的加载

内存单位转换

'memory': info['memory_info'].rss / 1024 / 1024
rss (Resident Set Size) 是进程实际占用的物理内存从字节转换为 MB,便于用户理解

4.3.2 搜索过滤功能

# 保存所有进程用于搜索
self.all_processes = processes

# 过滤进程
if filter_text:
    filter_text = filter_text.lower()
    processes = [p for p in processes if filter_text in p['name'].lower()]

# 按内存使用排序
processes.sort(key=lambda x: x['memory'], reverse=True)

实现要点

双列表设计

all_processes 保存完整进程列表processes 是过滤后的显示列表支持清除搜索后恢复完整列表

不区分大小写搜索

统一转换为小写进行匹配提升用户体验,不需要精确输入

部分匹配算法

使用 in 操作符实现子串匹配例如搜索 “chrome” 可以匹配 “chrome.exe”、“chromedriver.exe”

智能排序

按内存使用量降序排列帮助用户快速找到占用资源最多的进程

4.3.3 批量添加功能

def on_batch_add(self, event):
    """批量添加当前显示的搜索结果"""
    if self.process_list.GetItemCount() == 0:
        wx.MessageBox('当前没有可添加的进程', '提示', wx.OK | wx.ICON_INFORMATION)
        return
    
    search_text = self.search_box.GetValue().strip()
    if not search_text:
        wx.MessageBox('请先搜索进程,然后使用此功能批量添加搜索结果', '提示', wx.OK | wx.ICON_INFORMATION)
        return
    
    # 获取当前显示的所有进程名称
    process_names = set()
    for i in range(self.process_list.GetItemCount()):
        process_name = self.process_list.GetItemText(i, 1)
        process_names.add(process_name)

设计思路

前置检查

验证是否有可添加的进程验证用户是否执行了搜索操作避免误操作和空操作

使用 set 去重

process_names = set()
自动去除重复的进程名例如多个 chrome.exe 实例只添加一次

确认对话框

msg = f'确定要将以下 {len(process_names)} 个搜索结果添加到批量关闭列表吗?\n\n'
msg += '\n'.join(sorted(process_names))
dlg = wx.MessageDialog(self, msg, '确认批量添加', wx.YES_NO | wx.ICON_QUESTION)
显示将要添加的进程列表给用户最后的确认机会防止误操作

时间戳记录

current_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
for process_name in process_names:
    if process_name not in self.saved_processes:
        self.saved_processes[process_name] = current_time
        added_count += 1
记录每个进程的添加时间便于追踪和管理

4.3.4 一键批量结束

def on_kill_all(self, event):
    """一键批量结束进程"""
    if not self.saved_processes:
        wx.MessageBox('批量关闭列表为空', '提示', wx.OK | wx.ICON_INFORMATION)
        return
    
    process_names = list(self.saved_processes.keys())
    msg = f'确定要结束以下 {len(process_names)} 个进程吗?\n\n' + '\n'.join(process_names)
    
    dlg = wx.MessageDialog(self, msg, '确认批量结束进程', wx.YES_NO | wx.ICON_WARNING)
    
    if dlg.ShowModal() == wx.ID_YES:
        killed_count = 0
        failed_list = []
        
        for process_name in process_names:
            try:
                for proc in psutil.process_iter(['name']):
                    if proc.info['name'] == process_name:
                        try:
                            proc.terminate()
                            killed_count += 1
                        except (psutil.NoSuchProcess, psutil.AccessDenied) as e:
                            failed_list.append(f"{process_name}: {str(e)}")
            except Exception as e:
                failed_list.append(f"{process_name}: {str(e)}")

实现细节剖析

双重确认机制

第一重:检查列表是否为空第二重:显示警告对话框,用户需点击"是"才执行最大程度防止误操作

进程终止策略

proc.terminate()  # 发送 SIGTERM 信号
使用 terminate() 而非 kill()允许进程优雅退出,保存数据如果需要强制终止,可以改用 kill()

按名称匹配进程

不依赖 PID,因为 PID 会变化按进程名匹配,可以终止所有同名实例例如关闭所有 chrome.exe 进程

详细的结果反馈

result_msg = f'成功结束 {killed_count} 个进程'
if failed_list:
    result_msg += f'\n\n失败 {len(failed_list)} 个:\n' + '\n'.join(failed_list)
统计成功和失败的数量列出失败的原因(权限不足、进程不存在等)帮助用户了解操作结果

自动刷新

self.load_processes()  # 刷新进程列表
操作完成后自动刷新列表让用户直观看到效果

4.3.5 数据持久化

加载配置文件

def load_saved_processes(self):
    """从文件加载保存的进程列表"""
    if os.path.exists(self.config_file):
        try:
            with open(self.config_file, 'r', encoding='utf-8') as f:
                content = f.read().strip()
                if not content:  # 文件为空
                    return {}
                return json.loads(content)
        except json.JSONDecodeError as e:
            print(f'配置文件格式错误: {e}')
            # 备份损坏的文件
            if os.path.exists(self.config_file):
                backup_file = f"{self.config_file}.backup_{datetime.now().strftime('%Y%m%d_%H%M%S')}"
                os.rename(self.config_file, backup_file)
                print(f'已备份损坏的配置文件到: {backup_file}')
            return {}

健壮性设计

空文件处理

content = f.read().strip()
if not content:
    return {}
避免解析空文件导致的 JSON 错误

自动备份机制

检测到配置文件损坏时自动备份备份文件名包含时间戳,避免覆盖不影响程序正常启动

多层异常处理

json.JSONDecodeError:JSON 格式错误通用 Exception:其他未预料的错误确保程序不会因配置文件问题崩溃

保存配置文件

def save_saved_processes(self):
    """保存进程列表到文件"""
    try:
        with open(self.config_file, 'w', encoding='utf-8') as f:
            json.dump(self.saved_processes, f, ensure_ascii=False, indent=2)
    except Exception as e:
        wx.MessageBox(f'保存配置文件失败: {str(e)}', '错误', wx.OK | wx.ICON_ERROR)

格式化选项

ensure_ascii=False:支持中文等 Unicode 字符indent=2:美化输出,便于人工查看和编辑

4.3.6 导入导出功能

导出实现

def on_export_list(self, event):
    """导出批量关闭列表"""
    if not self.saved_processes:
        wx.MessageBox('批量关闭列表为空,无法导出', '提示', wx.OK | wx.ICON_INFORMATION)
        return
    
    wildcard = "JSON文件 (*.json)|*.json|所有文件 (*.*)|*.*"
    dlg = wx.FileDialog(self, "导出批量关闭列表", 
                       defaultFile=f"process_list_{datetime.now().strftime('%Y%m%d_%H%M%S')}.json",
                       wildcard=wildcard,
                       style=wx.FD_SAVE | wx.FD_OVERWRITE_PROMPT)

特色功能

    自动生成带时间戳的文件名文件类型过滤器,引导用户选择 JSON 格式wx.FD_OVERWRITE_PROMPT 覆盖提示,防止误操作

导入实现

def on_import_list(self, event):
    """导入批量关闭列表"""
    # ... 文件选择对话框 ...
    
    # 询问是否覆盖还是合并
    if self.saved_processes:
        merge_dlg = wx.MessageDialog(self, 
                                    '当前列表不为空\n\n点击"是"合并导入\n点击"否"覆盖当前列表\n点击"取消"放弃导入',
                                    '导入选项',
                                    wx.YES_NO | wx.CANCEL | wx.ICON_QUESTION)
        result = merge_dlg.ShowModal()
        
        if result == wx.ID_YES:
            # 合并逻辑
            for key, value in imported_data.items():
                if key not in self.saved_processes:
                    self.saved_processes[key] = value
                    added_count += 1
        elif result == wx.ID_NO:
            # 覆盖逻辑
            self.saved_processes = imported_data

智能导入策略

    三种选择:合并、覆盖、取消合并模式:只添加新进程,保留现有进程覆盖模式:完全替换当前列表详细反馈:显示新增、已存在的进程数量

4.4 事件绑定机制

wxPython 使用事件驱动模型,所有用户交互都通过事件处理:

# 按钮点击事件
self.refresh_btn.Bind(wx.EVT_BUTTON, self.on_refresh)
self.add_to_list_btn.Bind(wx.EVT_BUTTON, self.on_add_to_list)
self.batch_add_btn.Bind(wx.EVT_BUTTON, self.on_batch_add)

# 文本框回车事件
self.search_box.Bind(wx.EVT_TEXT_ENTER, self.on_search)

# 导入导出事件
self.export_list_btn.Bind(wx.EVT_BUTTON, self.on_export_list)
self.import_list_btn.Bind(wx.EVT_BUTTON, self.on_import_list)

事件处理函数命名规范

on_ 前缀:表示这是一个事件处理函数动词描述:清晰表达函数功能例如:on_refreshon_searchon_kill_all

五、结果

5.1 功能展示

经过完整开发,程序实现了以下功能模块:

基础功能

进程列表展示

显示 PID、进程名、内存占用、CPU 使用率按内存使用量降序排序实时刷新进程信息

进程搜索

支持进程名模糊搜索不区分大小写显示匹配进程数量

单个添加

从进程列表选中单个进程添加到批量关闭列表记录添加时间

高级功能

批量添加

将搜索结果一次性全部添加自动去重显示添加统计

一键批量结束

批量终止列表中的所有进程双重确认机制详细的执行结果反馈

列表管理

从列表移除单个进程清空整个列表持久化存储

导入导出

导出为 JSON 文件从文件导入(支持合并/覆盖)支持多场景切换

5.2 技术指标

指标数值/描述
代码行数约 500 行
启动速度< 2 秒
内存占用约 30-50 MB
进程刷新速度< 1 秒 (数百个进程)
支持系统Windows 7/8/10/11
Python 版本Python 3.6+

5.3 用户体验优化

视觉反馈

危险操作使用红色按钮状态栏实时显示操作结果对话框提供详细信息

操作便捷性

支持回车快捷键搜索分割窗口可调整大小一键操作减少点击次数

容错机制

多层异常处理配置文件损坏自动备份操作前二次确认

数据安全

自动保存配置导出备份功能合并导入避免数据丢失

5.4 实际应用案例

案例1:开发环境清理

{
  "Code.exe": "2025-01-10 10:30:00",
  "mysql.exe": "2025-01-10 10:30:05",
  "node.exe": "2025-01-10 10:30:10",
  "python.exe": "2025-01-10 10:30:15"
}

一键关闭所有开发工具,释放 4GB+ 内存。

案例2:办公软件批量管理

{
  "WeChat.exe": "2025-01-10 18:00:00",
  "DingTalk.exe": "2025-01-10 18:00:00",
  "WXWork.exe": "2025-01-10 18:00:00"
}

下班一键清理,避免消息打扰。

案例3:游戏优化

{
  "steam.exe": "2025-01-10 22:00:00",
  "steamwebhelper.exe": "2025-01-10 22:00:00",
  "gameoverlayui.exe": "2025-01-10 22:00:00"
}

游戏结束后清理后台进程,避免占用资源。

以上就是使用Python和wxPython开发的Windows进程管理工具的详细内容,更多关于Python Windows进程管理工具的资料请关注其它相关文章!

相关推荐