如何用tkinter实现点击GUI按钮后台执行cmd命令并展示结果
Tkinter 静默执行CMD命令并展示结果实现方案
核心实现逻辑
所有CMD调用逻辑完全封装在代码内部,执行过程对用户隐藏,仅最终整理后的可读信息展示给用户,不需要用户掌握任何命令相关知识。
关键注意事项
- 静默执行无黑框:Windows平台下给
subprocess加creationflags=subprocess.CREATE_NO_WINDOW参数即可完全隐藏命令执行窗口 - 避免GUI卡顿:耗时命令放入子线程执行,防止点击按钮后界面无响应
- 输出编码兼容:Windows CMD默认输出编码为GBK,指定编码避免中文乱码
- 信息格式化:用正则从原始命令输出中提取用户需要的关键字段,过滤无用信息
完整可运行代码示例
import tkinter as tk from tkinter import ttk import subprocess import threading import re class CMDTool: def __init__(self, root): self.root = root self.root.title("系统信息查询工具") self.root.geometry("600x400") # 多页容器 self.container = tk.Frame(root) self.container.pack(fill=tk.BOTH, expand=True, padx=10, pady=10) # 主页(功能按钮页) self.main_page = tk.Frame(self.container) self.main_page.pack(fill=tk.BOTH, expand=True) tk.Label(self.main_page, text="请选择要查询的信息", font=("微软雅黑", 14)).pack(pady=20) ttk.Button(self.main_page, text="网络信息", command=self.get_network_info, width=20).pack(pady=10) # 可扩展其他功能按钮,示例如下 # ttk.Button(self.main_page, text="CPU信息", command=self.get_cpu_info, width=20).pack(pady=10) # 结果展示页 self.result_page = tk.Frame(self.container) self.result_text = tk.Text(self.result_page, font=("微软雅黑", 10), wrap=tk.WORD) self.result_text.pack(fill=tk.BOTH, expand=True, pady=10) ttk.Button(self.result_page, text="返回主页", command=self.back_to_main).pack(pady=5) def back_to_main(self): self.result_page.pack_forget() self.main_page.pack(fill=tk.BOTH, expand=True) self.result_text.delete(1.0, tk.END) def run_cmd(self, cmd): """封装静默执行CMD命令的通用方法,返回命令输出内容""" startupinfo = subprocess.STARTUPINFO() startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW startupinfo.wShowWindow = subprocess.SW_HIDE result = subprocess.run( cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, creationflags=subprocess.CREATE_NO_WINDOW, encoding="gbk", errors="ignore" ) return result.stdout def get_network_info(self): """网络信息查询按钮回调,开子线程执行避免卡住UI""" threading.Thread(target=self._get_network_info_thread, daemon=True).start() def _get_network_info_thread(self): # 后台静默执行ipconfig /all命令 raw_output = self.run_cmd("ipconfig /all") # 提取关键信息,可根据需求调整正则匹配规则 info = "=== 网络信息查询结果 ===\n\n" # 提取IPv4地址 ipv4_match = re.search(r"IPv4 地址[ .]*: ([\d.]+)", raw_output) if ipv4_match: info += f"IPv4地址:{ipv4_match.group(1)}\n" # 提取MAC地址 mac_match = re.search(r"物理地址[ .]*: ([\w-]+)", raw_output) if mac_match: info += f"物理地址(MAC):{mac_match.group(1)}\n" # 提取默认网关 gateway_match = re.search(r"默认网关[ .]*: ([\d.]+)", raw_output) if gateway_match: info += f"默认网关:{gateway_match.group(1)}\n" # 提取DNS服务器 dns_match = re.search(r"DNS 服务器[ .]*: ([\d.]+)", raw_output) if dns_match: info += f"首选DNS服务器:{dns_match.group(1)}\n" # 结果更新到UI(tkinter组件仅支持主线程更新,用after方法调度) self.root.after(0, lambda: self._update_result(info)) def _update_result(self, info): self.main_page.pack_forget() self.result_page.pack(fill=tk.BOTH, expand=True) self.result_text.insert(tk.END, info) if __name__ == "__main__": root = tk.Tk() app = CMDTool(root) root.mainloop()
扩展说明
需要新增其他查询功能仅需三步:
- 在主页新增对应功能按钮,绑定回调函数
- 新增线程执行方法,调用
run_cmd传入对应的CMD命令 - 用正则提取需要展示的字段,调用
_update_result展示即可
内容的提问来源于stack exchange,提问作者Navi Kzc
相关产品推荐
相关产品推荐

