python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python Windows进程管理工具

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

作者:winfredzhang

在日常使用 Windows 系统的过程中,我们经常会遇到需要批量管理进程的场景,Windows 自带的任务管理器虽然功能强大,但在批量管理进程方面存在明显不足,因此,本文给大家介绍了如何使用Python和wxPython开发的Windows进程管理工具,需要的朋友可以参考下

一、背景

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

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

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

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

二、目标

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

主要目标

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

技术目标

三、方法

3.1 技术选型

编程语言:Python 3.x

GUI 框架:wxPython

进程管理库:psutil

数据存储:JSON

3.2 系统架构设计

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

3.3 核心模块设计

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

四、过程

4.1 类结构分析

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

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

核心属性

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))

关键点:

进程列表控件

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)

设计考量:

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 设计亮点:

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

技术细节分析

进程迭代优化

异常处理

内存单位转换

'memory': info['memory_info'].rss / 1024 / 1024

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)

实现要点

双列表设计

不区分大小写搜索

部分匹配算法

智能排序

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()

确认对话框

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 信号

按名称匹配进程

详细的结果反馈

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 {}

自动备份机制

多层异常处理

保存配置文件

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)

格式化选项

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)

特色功能

  1. 自动生成带时间戳的文件名
  2. 文件类型过滤器,引导用户选择 JSON 格式
  3. 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

智能导入策略

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

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)

事件处理函数命名规范

五、结果

5.1 功能展示

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

基础功能

进程列表展示

进程搜索

单个添加

高级功能

批量添加

一键批量结束

列表管理

导入导出

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进程管理工具的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文