本文主要是介绍如何使用Python实现一个简单的window任务管理器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
《如何使用Python实现一个简单的window任务管理器》这篇文章主要为大家详细介绍了如何使用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()
方法扩展
任务管理器具体功能有:
1、 列出系统当前所有进程。
2、 列出隶属于该进程的所有线程。
3、 如果进程有窗口,可以显示和隐藏窗口。
4、 强行结束指定进程。
通过Python调用Windows API还是很实用的,能够结合Python的简洁和Windows API的强大,写出各种各样的脚本。
编码中的几个难点有:
调用API的具体方式是什么?
答:通过win32模块或ctypes模块。前者更简便,后者函数库更全。
不熟悉Windows pythonAPI怎么办?
通过API伴侣这个软件查询API所在的DLL库,通过MSDN查询API的详细解释等等。
完整代码如下:
import os # import win32api import win32gui impQeGJWYtgEVort win32process from ctypes import * # 列出系统当前所有进程。 def getProcessList(): os.system("tasklist") # 结构体 class THREADENTRY32(Structure): _fields_ = [('dwSize', c_ulong), ('cntUsage', c_ulong), ('th32ThreadID', c_ulong), ('th32OwnerProcessID', c_ulong), ('tpBasePri', c_long), ('tpDeltaPri', c_long), ('dwFlags', c_ulong)] # 获取指定进程的所有线程 def getThreadOfProcess(pid): dll = windll.LoadLibrary("KERNEL32.DLL") snapshotHandle = dll.CreateToolhelp32Snapshot(0x00000004, pid) struct = THREADENTRY32() struct.dwSize = sizeof(THREADENTRY32) flag = dll.Thread32First(snapshotHandle, byref(struct)) while flag != 0: if(struct.th32OwnerProcessID == int(pid)): print("线程id:"+str(struct.th32ThreadID)) flag = dll.Thread32Next(snapshotHandle, byref(struct)) dll.CloseHandle(snapshotHandle) # EnumWindows的回调函数 def callback(hwnd, windows): pidList = win32process.GetWindowThreadProcessId(hwnd) for pid in pidList: windows.setdefault(pid, []) windows[pid].append(hwnd) # 显示和隐藏指定进程的窗口 def changeWindowState(pid, status): windows = {} win32gui.EnumWindows(callback, windows) try: hwndList = windows[int(pid)] # 显示/隐藏窗口 for hwnd in hwndList: win32gui.ShowWindow(hwnd, int(status)) except: print("进程不存在") # 强行结束指定进程 def killProcess(pid): cmd = 'taskkill /pid ' + pid + ' /f' try: os.system(cmd) except Exception as e: print(e) if __name__ == "__main__": while(True): print() print() print("************************************") print("* *") print("* 进程管理器 *") print("* *") print("* 1.获取所有进程 *") print("* python 2.获取指定进程的所有线程 *") print("* 3.显示和隐藏指定进程的窗口 *") print("* 4.强行结束指定进程 *") print("* *") print("************************************") option = input("请选择功能:") if option == "1": getProcessList() elif option == "2": pid = input("请输入进程的pid:") getpythonThreadOfProcess(pid) elif option == "3": pid = input("请输入进程的pid:") status = input("隐藏输入0,显示输入1:") changeWindowState(pid, status) elif option == "4": pid = input("请输入进程的pid:") www.chinasem.cn killProcess(pid) else: exit()
到此这篇关于如何使用Python实现一个简单的window任务管理器的文章就介绍到这了,更多相关Python任务管理器内容请搜索China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程China编程(www.chinasem.cn)!
这篇关于如何使用Python实现一个简单的window任务管理器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!