?重磅!盹貓的個人小站正式上線啦~誠邀各位技術大佬前來探秘!?
這里有:
?
- 硬核技術干貨:編程技巧、開發經驗、踩坑指南,帶你解鎖技術新姿勢!
- 趣味開發日常:代碼背后的腦洞故事、工具測評,讓技術圈不再枯燥~
- 獨家資源分享:開源項目、學習資料包,助你打怪升級快人一步!
👉?點擊直達→?盹貓貓的個人小站?👈
🌟 來逛逛吧,說不定能挖到你正在找的技術寶藏哦~
目錄
一、整體功能概述
二、核心技術棧
三、功能模塊解析
1. GUI 構建
2. 驗證碼獲取與展示
3. 登錄邏輯
4. 自動刷時長邏輯
5. UI 狀態機
四、實現效果
五、總結
歡迎來到 盹貓(>^ω^<)的博客
本篇文章主要介紹了
[使用 Tkinter + Requests 實現地理信息安全系統學習時長助手]
?博主廣交技術好友,喜歡文章的可以關注一下?
????????在在線學習系統中,學習時長往往是課程考核的關鍵指標。但手動掛機學習效率低,且需要不斷點擊頁面保持在線。本文將介紹如何利用 Python 的 Tkinter GUI 庫 和 Requests 網絡請求庫,編寫一個自動化的“學習時長助手”,實現自動登錄、驗證碼識別與刷新,以及后臺定時提交學習時長。
注:該程序用于網站(https://gistraining.webmap.cn/)的自動增加學習時長.
一、整體功能概述
本文的完整程序實現了以下功能:
-
圖形化界面:基于
Tkinter
構建,用戶可通過界面輸入用戶名、密碼、驗證碼。 -
驗證碼獲取與刷新:支持從服務器獲取驗證碼圖片,展示在 GUI 中。
-
自動登錄:支持輸入賬戶信息后自動登錄,并校驗返回結果。
-
時長刷課:后臺線程定時向服務器提交學習時長請求。
-
進度顯示:通過進度條和標簽展示當前已刷學習時長與目標時長。
-
狀態管理:應用有完善的狀態機機制,保證不同階段界面控件可用性合理切換。
最終效果是:用戶登錄成功后,點擊“開始刷時長”,程序將自動向服務器提交學習時長請求,并動態更新 UI。
二、核心技術棧
-
Tkinter:Python 標準庫中的 GUI 工具包,適合快速開發桌面工具。
-
Requests:Python 最常用的 HTTP 請求庫,用于和學習平臺進行交互。
-
Pillow (PIL):用于處理驗證碼圖片,方便在 Tkinter 中顯示。
-
多線程 + 隊列:利用
threading.Thread
與queue.Queue
實現異步網絡請求,避免阻塞 GUI。 -
狀態機模式:通過
set_ui_state
方法集中管理控件狀態,邏輯清晰。
三、功能模塊解析
1. GUI 構建
主界面由 三個主要區域組成:
-
登錄區:輸入用戶名、密碼、驗證碼,并支持刷新驗證碼。
-
控制區:設置請求間隔,開始或停止“刷時長”。
-
進度區:顯示已學習的時長和進度條。
示例代碼:
login_frame = ttk.LabelFrame(main_frame, text="登錄", padding="10")
self.username_entry = ttk.Entry(login_frame)
self.password_entry = ttk.Entry(login_frame)
self.captcha_entry = ttk.Entry(login_frame)
self.captcha_image_label = ttk.Label(login_frame)
這里我們利用 ttk.LabelFrame
分組,條理清晰,用戶操作直觀。
2. 驗證碼獲取與展示
驗證碼獲取邏輯通過單獨的線程運行,避免阻塞 GUI:
def _fetch_captcha_worker(self):response = self.session.get(self.URL_CAPTCHA, timeout=10)if response.status_code == 200:self.queue.put({"type": "captcha_image", "data": response.content})
取回圖片后,通過 Pillow
轉換為 ImageTk.PhotoImage
并展示:
image = Image.open(BytesIO(image_data))
self.captcha_photo = ImageTk.PhotoImage(image)
self.captcha_image_label.config(image=self.captcha_photo)
這樣用戶無需刷新頁面,即可獲取最新驗證碼。
3. 登錄邏輯
程序將密碼進行 Base64 編碼,并提交到服務器:
encoded_password = base64.b64encode(password.encode('utf-8')).decode('utf-8')
data = {'args[username]': username,'args[userpassword]': encoded_password,'args[randcode]': captcha,'userlogin': '1','userhash': str(time.time())
}
response = self.session.post(self.URL_LOGIN, data=data, timeout=10)
這里特別注意:
-
使用
requests.Session()
保持會話,避免重復登錄。 -
登錄結果通過 消息隊列傳遞給主線程,保證 Tkinter 線程安全。
4. 自動刷時長邏輯
核心邏輯在 worker_function
方法中實現:
-
每隔一定秒數,向學習平臺發送一次學習時長請求。
-
若請求成功,學習總時長
+1
并更新進度條。
while not self.stop_event.is_set() and self.total_minutes < self.target_minutes:response = self.session.post(self.URL_STUDY, headers=headers, data=data, timeout=10)if response.status_code == 200:self.queue.put("success")
通過 threading.Event
控制線程停止,確保用戶點擊“停止”后立即終止后臺任務。
5. UI 狀態機
不同階段控件狀態不同,例如:
-
登錄前:用戶名、密碼、驗證碼可編輯;
-
登錄中:所有控件禁用,避免重復點擊;
-
登錄成功:學習控制按鈕啟用;
-
刷課中:僅允許“停止”按鈕可點擊。
代碼:
states = {'IDLE': {...}, # 登錄前'LOGGING_IN': {...}, # 登錄中'LOGGED_IN': {...}, # 登錄成功'RUNNING': {...}, # 刷課中'STOPPED': {...}, # 刷課已停止
}
這種狀態機模式比直接在各處 config(state=...)
更清晰、更易維護。
四、實現效果
五、總結
通過本項目,不僅實現了一個實用的“學習時長助手”,還系統性地運用了以下技術點:
-
Tkinter GUI 設計與控件布局
-
Requests 會話管理與 POST 請求
-
多線程與隊列結合,解決 Tkinter 線程安全問題
-
狀態機模式簡化復雜 UI 控件管理
聲明:代碼在上方資源處獲取,僅作為學習用途,請勿用作非法用途,還是提倡認真學習!