使用Python構(gòu)建一個簡單的批處理GUI工具
在許多工作流程中,我們都會遇到需要重復(fù)執(zhí)行的一系列任務(wù)。手動執(zhí)行這些步驟可能既繁瑣又容易出錯。自動化此類序列可以顯著提高生產(chǎn)力。這篇博文將深入探討一個 Python 腳本,該腳本使用 wxPython 庫創(chuàng)建了一個圖形用戶界面 (GUI),用于定義、管理、保存、加載和執(zhí)行批處理計劃,并具備日志記錄和定時執(zhí)行功能。
C:\pythoncode\new\Batch OperatorGUI.py
核心思想:批處理計劃
基本概念是一個“批處理計劃”,它其實就是一個有序的步驟列表。每個步驟代表要執(zhí)行的單個操作。該工具允許用戶:
- 定義步驟: 指定操作類型以及任何必要的參數(shù)(如文件路徑、URL 或消息)。
- 管理步驟: 在計劃中添加、編輯、刪除、暫時禁用(“作廢”)和重新啟用步驟。
- 持久化計劃: 將定義的步驟序列保存到文件,并在以后加載回來。
- 執(zhí)行計劃: 按定義的順序運行活動步驟。
- 記錄結(jié)果: 可選擇地記錄執(zhí)行期間哪些步驟成功或失敗。
- 計劃執(zhí)行: 設(shè)置一個特定時間讓計劃自動運行。
代碼解析
讓我們看看 Python 腳本的關(guān)鍵組成部分。
1. Step 類:代表單個任務(wù)
class Step:
def __init__(self, action_type, parameter, status="正常"):
self.action_type = action_type # 動作類型
self.parameter = parameter # 參數(shù)
self.status = status # 狀態(tài):"正常" 或 "作廢"
def to_dict(self):
# 將 Step 對象轉(zhuǎn)換為字典,以便 JSON 保存
return {
"action_type": self.action_type,
"parameter": self.parameter,
"status": self.status
}
@staticmethod
def from_dict(d):
# 從字典(從 JSON 加載)創(chuàng)建 Step 對象
# 優(yōu)雅地處理加載舊的或簡化數(shù)據(jù)格式的可能性
if isinstance(d, dict):
return Step(d.get("action_type", "未知操作"), # 如果沒有,默認(rèn)為 "未知操作"
d.get("parameter", ""),
d.get("status", "正常")) # 如果沒有,默認(rèn)為 "正常"
else:
# 如果加載的數(shù)據(jù)不是字典,則將其視為手動提示
return Step("人工提示", str(d), "正常") # 動作類型為 "人工提示",狀態(tài)為 "正常"
這個類是一個簡單的數(shù)據(jù)結(jié)構(gòu),用于保存每個步驟的基本信息:
action_type:是什么類型的操作(例如,“運行Python腳本”、“打開文件”)。parameter:操作所需的數(shù)據(jù)(例如,腳本路徑、文件路徑、URL 或給用戶的消息)。status:步驟是活動的(“正常”)還是非活動的(“作廢”)。
to_dict 和 from_dict 方法對于使用 JSON 序列化來保存和加載計劃至關(guān)重要。值得注意的是,from_dict 包含了回退邏輯,用于處理加載的數(shù)據(jù)可能不是字典的情況,將其轉(zhuǎn)換為“人工提示”步驟。
2. MainFrame 類:GUI 引擎
這個繼承自 wx.Frame 的類是應(yīng)用程序的核心。
初始化 (
__init__):- 設(shè)置主窗口 (
wx.Frame)。 - 創(chuàng)建所有必要的 GUI 控件(widget):用于操作的按鈕 (
wx.Button)、顯示步驟的列表框 (wx.ListBox)、用于日志記錄和調(diào)度的復(fù)選框 (wx.CheckBox)、用于定時時間的文本控件 (wx.TextCtrl) 以及進(jìn)度條 (wx.Gauge)。 - 使用
wx.BoxSizer進(jìn)行布局管理,將這些控件整齊地排列。 - 將用戶交互(如按鈕點擊)綁定到相應(yīng)的處理方法(例如,
btn_add.Bind(wx.EVT_BUTTON, self.on_add))。 - 初始化
self.steps = []以存儲Step對象列表。 - 設(shè)置一個
wx.Timer以定期檢查計劃的執(zhí)行時間。
- 設(shè)置主窗口 (
步驟管理方法 (
on_add,on_edit,on_delete,on_void,on_recover):on_add/on_edit:這些方法打開StepDialog(稍后討論)以獲取用戶輸入,用于創(chuàng)建新步驟或修改現(xiàn)有步驟。然后它們更新self.steps列表并調(diào)用self.refresh_list。on_delete:從self.steps中刪除選定的步驟。on_void/on_recover:將選定步驟的status屬性修改為“作廢”或“正常”。refresh_list:清除self.listbox并使用self.steps中的當(dāng)前步驟重新填充它,顯示每個步驟的狀態(tài)、操作類型和參數(shù)。
持久化 (
on_save,on_load):on_save:遍歷self.steps,使用step.to_dict()將每個Step對象轉(zhuǎn)換為字典,并使用json庫將生成的字典列表保存到 “批處理計劃.json” 文件中。on_load:讀取 “批處理計劃.json” 文件,解析 JSON 數(shù)據(jù),使用Step.from_dict()將每個字典轉(zhuǎn)換回Step對象,更新self.steps,并刷新列表框。包含文件不存在時的基本錯誤處理。
執(zhí)行邏輯 (
on_run,execute_all_steps,execute_step):on_run:通過調(diào)用execute_all_steps來觸發(fā)主要的執(zhí)行邏輯。execute_all_steps:- 計算狀態(tài)為“正常”(活動)的步驟數(shù)量。
- 遍歷
self.steps列表。 - 如果步驟的狀態(tài)是“正常”,則在
try...except塊內(nèi)調(diào)用execute_step以處理潛在的運行時錯誤。 - 更新
self.gauge進(jìn)度條。 - 使用
wx.Yield():這在 GUI 應(yīng)用程序執(zhí)行長任務(wù)時很重要。它允許 GUI 事件循環(huán)處理掛起的事件,保持窗口響應(yīng)并防止其看起來“凍結(jié)”。 - 將每個步驟的成功或失敗(如果失敗,則包括錯誤消息)記錄到一個臨時列表中。
- 如果勾選了“保存日志”復(fù)選框,則將收集到的日志條目追加到 “執(zhí)行日志.txt” 文件中。
- 顯示完成消息。
execute_step:這是根據(jù)step.action_type執(zhí)行實際操作的地方:- “運行Python腳本”:使用
subprocess.Popen運行 Python 腳本。 - “打開文件”:使用
os.startfile(Windows 特定,相當(dāng)于雙擊文件)。 - “運行外部程序”:對于 URL(以 “http” 開頭)使用
webbrowser.open,對于其他可執(zhí)行文件/命令使用subprocess.Popen。 - “人工提示”:顯示一個簡單的消息框 (
wx.MessageBox),需要用戶交互。
- “運行Python腳本”:使用
計劃任務(wù) (
on_toggle_timer,check_time):on_toggle_timer:根據(jù)“啟用定時執(zhí)行”復(fù)選框的狀態(tài)啟動或停止self.timer。計時器設(shè)置為每 60000 毫秒(1 分鐘)觸發(fā)一次。check_time:當(dāng)計時器處于活動狀態(tài)時,此方法每分鐘被調(diào)用一次。它將當(dāng)前時間(HH:MM 格式)與self.time_picker文本控件中指定的時間進(jìn)行比較。如果匹配,則觸發(fā)execute_all_steps。
3. StepDialog 類:用戶輸入表單
class StepDialog(wx.Dialog):
# ... (初始化代碼設(shè)置了標(biāo)簽、選擇控件、文本控件、確定/取消按鈕) ...
def get_data(self):
# 返回用戶選擇的動作類型和輸入的參數(shù)文本
return self.action_choice.GetStringSelection(), self.parameter_text.GetValue()
這個簡單的對話框提供了一個表單,供用戶:
- 從下拉列表 (
wx.Choice) 中選擇action_type。 - 輸入
parameter文本 (wx.TextCtrl)。
當(dāng)用戶點擊“確定”時,MainFrame使用get_data方法來檢索輸入的值。
4. 主執(zhí)行塊 (if __name__ == "__main__":)
這個標(biāo)準(zhǔn)的 Python 結(jié)構(gòu)確保以下代碼僅在腳本直接執(zhí)行時運行:
- 創(chuàng)建
wx.App對象,這是任何wxPython應(yīng)用程序所必需的。 - 實例化
MainFrame。 - 使框架可見 (
frame.Show())。 - 啟動
wxPython事件循環(huán) (app.MainLoop()),它監(jiān)聽用戶交互和系統(tǒng)事件。
運行結(jié)果

以上就是使用Python構(gòu)建一個簡單的批處理GUI工具的詳細(xì)內(nèi)容,更多關(guān)于Python構(gòu)建GUI工具的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
使用Python實現(xiàn)將PDF轉(zhuǎn)為PDF/A和PDF/X
PDF/A和PDF/X是兩種有特定用途的PDF格式,本文主要介紹了如何使用Python將PDF轉(zhuǎn)換為PDF/A和PDF/X,以及如何將PDF/A格式轉(zhuǎn)換回標(biāo)準(zhǔn)的PDF格式,需要的可以參考下2024-04-04
Python Miniforge3 環(huán)境配置的實現(xiàn)
這篇文章主要介紹了Python Miniforge3 環(huán)境配置的實現(xiàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考,一起跟隨小編過來看看吧2017-11-11

