当前位置: 首页 > news >正文

python 实现一个简单的window 任务管理器

import tkinter as tk
from tkinter import ttk
import psutil

# 运行此代码前,请确保已经安装了 psutil 库,可以使用 pip install psutil 进行安装。
# 由于获取进程信息可能会受到权限限制,某些进程的信息可能无法获取,代码中已经对可能出现的异常进行了处理。

def get_process_info():
    process_list = []
    for proc in psutil.process_iter(['pid', 'name', 'memory_percent']):
        try:
            pid = proc.info['pid']
            name = proc.info['name']
            mem_percent = proc.info['memory_percent']
            process_list.append((pid, name, f'{mem_percent:.2f}%'))
        except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
            continue
    return process_list


def populate_table():
    for item in process_table.get_children():
        process_table.delete(item)
    processes = get_process_info()
    for pid, name, mem_percent in processes:
        mem_value = float(mem_percent.strip('%'))
        tag = ""
        if mem_value > 10:
            tag = "high_mem"
        elif mem_value > 5:
            tag = "medium_mem"
        process_table.insert('', 'end', values=(pid, name, mem_percent), tags=(tag,))

    # 设置标签样式
    process_table.tag_configure("high_mem", foreground="red")
    process_table.tag_configure("medium_mem", foreground="green")


def sort_table(column, reverse):
    data = [(process_table.set(item, column), item) for item in process_table.get_children('')]
    if column == 'PID':
        data.sort(key=lambda t: int(t[0]), reverse=reverse)
    elif column == '内存占用率':
        data.sort(key=lambda t: float(t[0].strip('%')), reverse=reverse)
    else:
        data.sort(key=lambda t: t[0], reverse=reverse)

    for index, (_, item) in enumerate(data):
        process_table.move(item, '', index)

    process_table.heading(column, command=lambda: sort_table(column, not reverse))


root = tk.Tk()
root.title("任务管理器")
root.geometry("700x500")
root.configure(bg="#f4f4f9")

style = ttk.Style()
style.theme_use('clam')
style.configure('Treeview', background="#e9e9f3", foreground="#333", fieldbackground="#e9e9f3",
                rowheight=25, font=('Segoe UI', 10))
style.map('Treeview', background=[('selected', '#73a6ff')])
style.configure('Treeview.Heading', background="#d1d1e0", foreground="#333", font=('Segoe UI', 10, 'bold'))

columns = ('PID', '进程名称', '内存占用率')
process_table = ttk.Treeview(root, columns=columns, show='headings')
for col in columns:
    process_table.heading(col, text=col, command=lambda c=col: sort_table(c, False))
    process_table.column(col, width=200, anchor='center')
process_table.pack(pady=20, padx=20, fill=tk.BOTH, expand=True)

populate_table()

refresh_button = ttk.Button(root, text="刷新", command=populate_table)
refresh_button.pack(pady=10)

root.mainloop()
    

相关文章:

  • 【深入理解 SpringBoot3】第一弹:SpringBoot3 快速入门
  • MATLAB+Arduino利用板上的按键控制板上Led灯
  • Ant Design Vue Select 选择器 全选 功能
  • 深度学习核心算法
  • git 基础操作
  • Python---数据分析(Pandas十:二维数组DataFrame统计计算一)
  • SpringCloud介绍
  • SQL的DCL,DDL,DML和DQL分别是什么
  • 运维--个人打包脚本分享(Linux)
  • canvas数据标注功能简单实现:矩形、圆形
  • 2025年如何避免使用验证码求解器时被IP封禁
  • (每日一道算法题)翻转对
  • 基于 ECharts 实现动态图表渲染支持10万+数据点实时更新方案
  • Flutter使用自签证书打包ipa
  • Excel 小黑第19套
  • 基于springboot的美容院管理系统(044)
  • 深圳问顶安全科技有限公司asktopsec是做什么的?
  • 事件、页面跳转、wxml语法——微信小程序学习笔记
  • 【AI】Orin Nano+ubuntu22.04上移植YoloV11,并使用DeepStream测试成功
  • How to share files with Windows via samba in Linux mint 22
  • 季后赛主场优势消失之谜,这事竟然要赖库里
  • 女高音吴睿睿“古词新唱”,穿着汉服唱唐诗宋词
  • 这些网红果蔬正在收割你的钱包,营养师:吃了个寂寞
  • 电影路演,虚幻狂欢?
  • 署名文章:从宏观调控看中国经济基本面
  • 马克龙称法英正与乌克兰商议“在乌部署欧洲军队”