用 Python 的 tkinter(注意:是 tkinter 不是 kinter,这是 Python 内置的 GUI 库,无需额外安装)制作一个可视化工具,实现批量执行脚本、提升工作效率。
下面我实现一个实用的批量脚本执行工具,核心功能包括:选择多个脚本文件(.py)、一键批量执行、实时显示执行日志(成功/失败信息),全程可视化操作,无需手动在终端输入命令,真正解放双手。

tkinter 搭建可视化界面(选择文件、执行、清空日志按钮 + 文件列表 + 日志显示区域)subprocess 模块调用系统命令执行import tkinter as tk
from tkinter import filedialog, scrolledtext, messagebox
import subprocess
import os
import sys
classBatchScriptExecutor:
def__init__(self, root):
# 初始化主窗口
self.root = root
self.root.title("Python 脚本批量执行工具 - 效率提升版")
self.root.geometry("800x600") # 窗口大小:宽800,高600
# 存储选中的脚本文件路径
self.selected_scripts = []
# 搭建GUI界面
self._build_ui()
def_build_ui(self):
"""构建可视化界面"""
# 第一排:选择脚本文件按钮
self.select_btn = tk.Button(
self.root,
text="📂 选择Python脚本(可多选)",
command=self.select_scripts,
font=("微软雅黑", 10),
bg="#4CAF50",
fg="white"
)
self.select_btn.pack(pady=10, fill=tk.X, padx=20)
# 第二排:显示选中的脚本列表(带滚动条)
tk.Label(self.root, text="✅ 已选中的脚本列表", font=("微软雅黑", 10, "bold")).pack(anchor=tk.W, padx=20)
self.script_list_box = scrolledtext.ScrolledText(
self.root,
height=10,
font=("Consolas", 9),
state=tk.DISABLED # 初始不可编辑,仅用于显示
)
self.script_list_box.pack(pady=5, fill=tk.X, padx=20)
# 第三排:执行/清空按钮
self.btn_frame = tk.Frame(self.root)
self.btn_frame.pack(pady=10, fill=tk.X, padx=20)
self.run_btn = tk.Button(
self.btn_frame,
text="▶️ 一键批量执行",
command=self.run_batch_scripts,
font=("微软雅黑", 10),
bg="#2196F3",
fg="white"
)
self.run_btn.pack(side=tk.LEFT, padx=10)
self.clear_btn = tk.Button(
self.btn_frame,
text="🗑 清空所有内容",
command=self.clear_all,
font=("微软雅黑", 10),
bg="#f44336",
fg="white"
)
self.clear_btn.pack(side=tk.LEFT, padx=10)
# 第四排:执行日志显示区域
tk.Label(self.root, text="📝 执行日志(实时更新)", font=("微软雅黑", 10, "bold")).pack(anchor=tk.W, padx=20)
self.log_text = scrolledtext.ScrolledText(
self.root,
height=15,
font=("Consolas", 9),
state=tk.DISABLED
)
self.log_text.pack(pady=5, fill=tk.BOTH, padx=20, expand=True)
defselect_scripts(self):
"""选择多个Python脚本文件"""
# 弹出文件选择对话框,支持多选 .py 文件
files = filedialog.askopenfilenames(
title="选择Python脚本文件",
filetypes=(("Python Files", "*.py"), ("All Files", "*.*")),
initialdir=os.getcwd() # 初始目录为当前工作目录
)
if files:
# 更新选中的脚本列表
self.selected_scripts = list(files)
# 显示选中的文件到列表框
self._update_script_list()
# 日志区域提示选择成功
self._append_log(f"【提示】成功选择 {len(self.selected_scripts)} 个Python脚本文件\n")
def_update_script_list(self):
"""更新脚本列表显示"""
# 先启用列表框,编辑完成后禁用
self.script_list_box.config(state=tk.NORMAL)
self.script_list_box.delete(1.0, tk.END) # 清空原有内容
for idx, script in enumerate(self.selected_scripts, 1):
# 显示:序号 + 文件名(完整路径)
self.script_list_box.insert(tk.END, f"{idx}. {os.path.abspath(script)}\n")
self.script_list_box.config(state=tk.DISABLED)
defrun_batch_scripts(self):
"""批量执行选中的Python脚本"""
ifnot self.selected_scripts:
messagebox.showwarning("警告", "请先选择至少一个Python脚本文件!")
return
# 日志区域提示开始执行
self._append_log("="*50 + "\n")
self._append_log("【开始执行】批量脚本执行任务启动...\n")
self._append_log("="*50 + "\n")
# 遍历每个选中的脚本,逐个执行
for idx, script_path in enumerate(self.selected_scripts, 1):
script_name = os.path.basename(script_path)
self._append_log(f"\n【正在执行】第 {idx} 个脚本:{script_name}\n")
try:
# 调用subprocess执行脚本,捕获输出和错误信息
# sys.executable 确保使用当前Python解释器执行,避免环境冲突
result = subprocess.run(
[sys.executable, script_path],
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
encoding="utf-8",
timeout=300# 超时时间:5分钟(可根据脚本耗时调整)
)
# 处理执行结果
if result.returncode == 0:
# 执行成功
self._append_log(f"【执行成功】{script_name} 运行完成!\n")
if result.stdout:
self._append_log(f"【脚本输出】\n{result.stdout}\n")
else:
# 执行失败(返回码非0)
self._append_log(f"【执行失败】{script_name} 运行出错!\n")
if result.stderr:
self._append_log(f"【错误信息】\n{result.stderr}\n")
except subprocess.TimeoutExpired:
self._append_log(f"【执行超时】{script_name} 运行超过5分钟,已终止!\n")
except Exception as e:
self._append_log(f"【未知错误】{script_name}:{str(e)}\n")
# 执行完成提示
self._append_log("\n" + "="*50 + "\n")
self._append_log("【执行结束】批量脚本任务全部处理完毕!\n")
self._append_log("="*50 + "\n")
messagebox.showinfo("完成", "批量脚本执行任务已全部结束!请查看日志详情。")
def_append_log(self, content):
"""向日志区域追加内容(实时更新)"""
# 先启用日志框,追加内容后禁用,防止用户手动编辑
self.log_text.config(state=tk.NORMAL)
self.log_text.insert(tk.END, content)
self.log_text.see(tk.END) # 自动滚动到末尾,显示最新日志
self.log_text.config(state=tk.DISABLED)
# 强制刷新界面,确保日志实时显示
self.root.update_idletasks()
defclear_all(self):
"""清空选中的脚本列表和日志内容"""
# 清空脚本列表
self.selected_scripts = []
self.script_list_box.config(state=tk.NORMAL)
self.script_list_box.delete(1.0, tk.END)
self.script_list_box.config(state=tk.DISABLED)
# 清空日志
self.log_text.config(state=tk.NORMAL)
self.log_text.delete(1.0, tk.END)
self.log_text.config(state=tk.DISABLED)
messagebox.showinfo("提示", "已成功清空所有内容!")
if __name__ == "__main__":
# 启动GUI程序
root = tk.Tk()
app = BatchScriptExecutor(root)
root.mainloop()
tkinter,无需额外安装;如果提示缺少 tkinter,Windows/macOS 通常自带,Linux 可执行 sudo apt install python3-tk 安装).py 脚本需确保:chmod +x 脚本名.py)batch_script_executor.pypython batch_script_executor.py,启动可视化工具Ctrl 键选择多个需要批量执行的 .py 文件filedialog.askopenfilenames() 实现,支持 .py 文件筛选,默认打开当前工作目录subprocess.run() 调用当前 Python 解释器(sys.executable)执行脚本,避免环境冲突,同时捕获标准输出和错误输出_append_log() 方法更新日志区域,自动滚动到末尾,且设置为不可编辑,防止误操作.py 脚本.txt 文件threading)tkinter 实现可视化,无需额外安装依赖,开箱即用,核心是通过 subprocess 批量调用 Python 解释器执行脚本。