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