在许多工作流程中,我们都会遇到需要重复执行的一系列任务。手动执行这些步骤可能既繁琐又容易出错。自动化此类序列可以显著提高生产力。这篇博文将深入探讨一个 python 脚本,该脚本使用 wxpython 库创建了一个图形用户界面 (gui),用于定义、管理、保存、加载和执行批处理计划,并具备日志记录和定时执行功能。
c:\pythoncode\new\batch operatorgui.py
核心思想:批处理计划
基本概念是一个“批处理计划”,它其实就是一个有序的步骤列表。每个步骤代表要执行的单个操作。该工具允许用户:
- 定义步骤: 指定操作类型以及任何必要的参数(如文件路径、url 或消息)。
- 管理步骤: 在计划中添加、编辑、删除、暂时禁用(“作废”)和重新启用步骤。
- 持久化计划: 将定义的步骤序列保存到文件,并在以后加载回来。
- 执行计划: 按定义的顺序运行活动步骤。
- 记录结果: 可选择地记录执行期间哪些步骤成功或失败。
- 计划执行: 设置一个特定时间让计划自动运行。
代码解析
让我们看看 python 脚本的关键组成部分。
1. step
类:代表单个任务
class step: def __init__(self, action_type, parameter, status="正常"): self.action_type = action_type # 动作类型 self.parameter = parameter # 参数 self.status = status # 状态:"正常" 或 "作废" def to_dict(self): # 将 step 对象转换为字典,以便 json 保存 return { "action_type": self.action_type, "parameter": self.parameter, "status": self.status } @staticmethod def from_dict(d): # 从字典(从 json 加载)创建 step 对象 # 优雅地处理加载旧的或简化数据格式的可能性 if isinstance(d, dict): return step(d.get("action_type", "未知操作"), # 如果没有,默认为 "未知操作" d.get("parameter", ""), d.get("status", "正常")) # 如果没有,默认为 "正常" else: # 如果加载的数据不是字典,则将其视为手动提示 return step("人工提示", str(d), "正常") # 动作类型为 "人工提示",状态为 "正常"
这个类是一个简单的数据结构,用于保存每个步骤的基本信息:
action_type
:是什么类型的操作(例如,“运行python脚本”、“打开文件”)。parameter
:操作所需的数据(例如,脚本路径、文件路径、url 或给用户的消息)。status
:步骤是活动的(“正常”)还是非活动的(“作废”)。
to_dict
和 from_dict
方法对于使用 json 序列化来保存和加载计划至关重要。值得注意的是,from_dict
包含了回退逻辑,用于处理加载的数据可能不是字典的情况,将其转换为“人工提示”步骤。
2. mainframe
类:gui 引擎
这个继承自 wx.frame
的类是应用程序的核心。
初始化 (
__init__
):- 设置主窗口 (
wx.frame
)。 - 创建所有必要的 gui 控件(widget):用于操作的按钮 (
wx.button
)、显示步骤的列表框 (wx.listbox
)、用于日志记录和调度的复选框 (wx.checkbox
)、用于定时时间的文本控件 (wx.textctrl
) 以及进度条 (wx.gauge
)。 - 使用
wx.boxsizer
进行布局管理,将这些控件整齐地排列。 - 将用户交互(如按钮点击)绑定到相应的处理方法(例如,
btn_add.bind(wx.evt_button, self.on_add)
)。 - 初始化
self.steps = []
以存储step
对象列表。 - 设置一个
wx.timer
以定期检查计划的执行时间。
- 设置主窗口 (
步骤管理方法 (
on_add
,on_edit
,on_delete
,on_void
,on_recover
):on_add
/on_edit
:这些方法打开stepdialog
(稍后讨论)以获取用户输入,用于创建新步骤或修改现有步骤。然后它们更新self.steps
列表并调用self.refresh_list
。on_delete
:从self.steps
中删除选定的步骤。on_void
/on_recover
:将选定步骤的status
属性修改为“作废”或“正常”。refresh_list
:清除self.listbox
并使用self.steps
中的当前步骤重新填充它,显示每个步骤的状态、操作类型和参数。
持久化 (
on_save
,on_load
):on_save
:遍历self.steps
,使用step.to_dict()
将每个step
对象转换为字典,并使用json
库将生成的字典列表保存到 “批处理计划.json” 文件中。on_load
:读取 “批处理计划.json” 文件,解析 json 数据,使用step.from_dict()
将每个字典转换回step
对象,更新self.steps
,并刷新列表框。包含文件不存在时的基本错误处理。
执行逻辑 (
on_run
,execute_all_steps
,execute_step
):on_run
:通过调用execute_all_steps
来触发主要的执行逻辑。execute_all_steps
:- 计算状态为“正常”(活动)的步骤数量。
- 遍历
self.steps
列表。 - 如果步骤的状态是“正常”,则在
try...except
块内调用execute_step
以处理潜在的运行时错误。 - 更新
self.gauge
进度条。 - 使用
wx.yield()
:这在 gui 应用程序执行长任务时很重要。它允许 gui 事件循环处理挂起的事件,保持窗口响应并防止其看起来“冻结”。 - 将每个步骤的成功或失败(如果失败,则包括错误消息)记录到一个临时列表中。
- 如果勾选了“保存日志”复选框,则将收集到的日志条目追加到 “执行日志.txt” 文件中。
- 显示完成消息。
execute_step
:这是根据step.action_type
执行实际操作的地方:- “运行python脚本”:使用
subprocess.popen
运行 python 脚本。 - “打开文件”:使用
os.startfile
(windows 特定,相当于双击文件)。 - “运行外部程序”:对于 url(以 “http” 开头)使用
webbrowser.open
,对于其他可执行文件/命令使用subprocess.popen
。 - “人工提示”:显示一个简单的消息框 (
wx.messagebox
),需要用户交互。
- “运行python脚本”:使用
计划任务 (
on_toggle_timer
,check_time
):on_toggle_timer
:根据“启用定时执行”复选框的状态启动或停止self.timer
。计时器设置为每 60000 毫秒(1 分钟)触发一次。check_time
:当计时器处于活动状态时,此方法每分钟被调用一次。它将当前时间(hh:mm 格式)与self.time_picker
文本控件中指定的时间进行比较。如果匹配,则触发execute_all_steps
。
3. stepdialog
类:用户输入表单
class stepdialog(wx.dialog): # ... (初始化代码设置了标签、选择控件、文本控件、确定/取消按钮) ... def get_data(self): # 返回用户选择的动作类型和输入的参数文本 return self.action_choice.getstringselection(), self.parameter_text.getvalue()
这个简单的对话框提供了一个表单,供用户:
- 从下拉列表 (
wx.choice
) 中选择action_type
。 - 输入
parameter
文本 (wx.textctrl
)。
当用户点击“确定”时,mainframe
使用get_data
方法来检索输入的值。
4. 主执行块 (if __name__ == "__main__":
)
这个标准的 python 结构确保以下代码仅在脚本直接执行时运行:
- 创建
wx.app
对象,这是任何wxpython
应用程序所必需的。 - 实例化
mainframe
。 - 使框架可见 (
frame.show()
)。 - 启动
wxpython
事件循环 (app.mainloop()
),它监听用户交互和系统事件。
运行结果
以上就是使用python构建一个简单的批处理gui工具的详细内容,更多关于python构建gui工具的资料请关注代码网其它相关文章!
发表评论