使用 Tkinter + Requests 實現地理信息安全系統學習時長助手

?重磅!盹貓的個人小站正式上線啦~誠邀各位技術大佬前來探秘!?

這里有:

?

  • 硬核技術干貨:編程技巧、開發經驗、踩坑指南,帶你解鎖技術新姿勢!
  • 趣味開發日常:代碼背后的腦洞故事、工具測評,讓技術圈不再枯燥~
  • 獨家資源分享:開源項目、學習資料包,助你打怪升級快人一步!

👉?點擊直達→?盹貓貓的個人小站?👈
🌟 來逛逛吧,說不定能挖到你正在找的技術寶藏哦~

目錄

一、整體功能概述

二、核心技術棧

三、功能模塊解析

1. GUI 構建

2. 驗證碼獲取與展示

3. 登錄邏輯

4. 自動刷時長邏輯

5. UI 狀態機

四、實現效果

五、總結


歡迎來到 盹貓(>^ω^<)的博客

本篇文章主要介紹了

[使用 Tkinter + Requests 實現地理信息安全系統學習時長助手]
?博主廣交技術好友,喜歡文章的可以關注一下?

????????在在線學習系統中,學習時長往往是課程考核的關鍵指標。但手動掛機學習效率低,且需要不斷點擊頁面保持在線。本文將介紹如何利用 Python 的 Tkinter GUI 庫Requests 網絡請求庫,編寫一個自動化的“學習時長助手”,實現自動登錄、驗證碼識別與刷新,以及后臺定時提交學習時長。

注:該程序用于網站(https://gistraining.webmap.cn/)的自動增加學習時長.

一、整體功能概述

本文的完整程序實現了以下功能:

  1. 圖形化界面:基于 Tkinter 構建,用戶可通過界面輸入用戶名、密碼、驗證碼。

  2. 驗證碼獲取與刷新:支持從服務器獲取驗證碼圖片,展示在 GUI 中。

  3. 自動登錄:支持輸入賬戶信息后自動登錄,并校驗返回結果。

  4. 時長刷課:后臺線程定時向服務器提交學習時長請求。

  5. 進度顯示:通過進度條和標簽展示當前已刷學習時長與目標時長。

  6. 狀態管理:應用有完善的狀態機機制,保證不同階段界面控件可用性合理切換。

最終效果是:用戶登錄成功后,點擊“開始刷時長”,程序將自動向服務器提交學習時長請求,并動態更新 UI。


二、核心技術棧

  • Tkinter:Python 標準庫中的 GUI 工具包,適合快速開發桌面工具。

  • Requests:Python 最常用的 HTTP 請求庫,用于和學習平臺進行交互。

  • Pillow (PIL):用于處理驗證碼圖片,方便在 Tkinter 中顯示。

  • 多線程 + 隊列:利用 threading.Threadqueue.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 控件管理

聲明:代碼在上方資源處獲取,僅作為學習用途,請勿用作非法用途,還是提倡認真學習!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/98777.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/98777.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/98777.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

構建一個優雅的待辦事項應用:現代JavaScript實踐

構建一個優雅的待辦事項應用&#xff1a;現代JavaScript實踐本文將介紹如何使用現代JavaScript&#xff08;ES6&#xff09;和DOM操作創建一個功能完整的待辦事項應用&#xff0c;無需任何外部庫或框架。功能概述添加新任務標記任務為完成/未完成編輯任務內容刪除任務過濾任務&…

【數據可視化-111】93大閱兵后的軍費開支情況———2024年全球軍費開支分析:用Python和Pyecharts打造炫酷可視化大屏

&#x1f9d1; 博主簡介&#xff1a;曾任某智慧城市類企業算法總監&#xff0c;目前在美國市場的物流公司從事高級算法工程師一職&#xff0c;深耕人工智能領域&#xff0c;精通python數據挖掘、可視化、機器學習等&#xff0c;發表過AI相關的專利并多次在AI類比賽中獲獎。CSDN…

3.2.Maven-概述-介紹安裝

一.介紹&#xff1a;二.安裝&#xff1a;Maven的安裝比較簡單&#xff0c;因為他是綠色版的軟件&#xff0c;官方給我們提供Maven的安裝包就是一個zip壓縮包&#xff0c;在進行Maven安裝以及配置的時候&#xff0c;主要進行如下4步操作&#xff1a;第一步&#xff1a;把官方提供…

Kafka面試精講 Day 14:集群擴容與數據遷移

【Kafka面試精講 Day 14】集群擴容與數據遷移 在“Kafka面試精講”系列的第14天&#xff0c;我們將深入探討 Kafka 運維中最關鍵的操作之一&#xff1a;集群擴容與數據遷移。隨著業務增長&#xff0c;原始 Kafka 集群可能面臨磁盤不足、吞吐瓶頸或節點負載不均等問題&#xff…

字節一面 面經(補充版)

什么是RabbitMQ&#xff0c;特點是什么怎么理解保障消息的一致性String、StringBuffer、StringBuilder解釋一下線程安全先操作數據庫再刪緩存還是先刪緩存再操作數據庫這種辦法能杜絕數據不一致問題嗎解釋一下AOP介紹Redis的特點&#xff08;Redis比較快&#xff09;Redis為什么…

【MFC】對話框屬性:Absolute Align(絕對對齊)

前言 本文介紹對話框屬性中的Absolute Align(絕對對齊)&#xff0c;同時給出相關示例便于理解。 目錄1 位置2 詳解3 示例1 位置 首先介紹一下這個屬性在哪里。 在資源視圖中雙擊對話框節點&#xff0c;打開該對話框&#xff1b; 鼠標右鍵工作區空白處&#xff0c;單擊屬性&…

【從0開始學習Java | 第17篇】集合(中-Set部分)

文章目錄Java集合之Set&#xff1a;無序不重復的元素容器一、Set接口的核心特性二、常用實現類及底層原理1. HashSet&#xff1a;基于哈希表的高效實現2. LinkedHashSet&#xff1a;保留插入順序的哈希實現3. TreeSet&#xff1a;基于紅黑樹的排序實現三、實現類對比與選擇建議…

玩轉Docker | 使用Docker部署dufs文件管理工具

玩轉Docker | 使用Docker部署dufs文件管理工具 前言 一、 dufs介紹 Dufs簡介 核心特性 ?? 靜態文件服務 ?? 文件夾打包下載 ?? 拖拽上傳文件/文件夾 ?? 文件在線創建、編輯與搜索 ? 斷點續傳與部分傳輸 ?? 細粒度訪問控制 ?? HTTPS 安全傳輸 ?? WebDAV 兼容支持…

【混合開發】vue+Android、iPhone、鴻蒙、win、macOS、Linux之android 把assert里的dist.zip 包解壓到sd卡里

一圖勝千言 上一篇有 <!-- 讀寫外部存儲 --> <uses-permission android:name"android.permission.WRITE_EXTERNAL_STORAGE"android:maxSdkVersion"28"/> <uses-permission android:name"android.permission.READ_EXTERNAL_STORAGE&qu…

線程的創建.銷毀

線程線程的創建在 C 中&#xff0c;線程的創建核心是通過std::thread類實現的&#xff0c;其構造函數需要傳入一個可調用對象&#xff08;Callable Object&#xff09;作為線程入口。可調用對象包括普通函數、lambda 表達式、函數對象&#xff08;functor&#xff09;、類的成員…

MySQL基礎全面解析

MySQL作為最流行的關系型數據庫管理系統之一&#xff0c;是每一位開發者必備的核心技能。本文將系統性地解析MySQL的基礎知識&#xff0c;結合關鍵概念與實戰應用&#xff0c;幫助您構建扎實的數據庫基礎。1. SQL與NoSQL的本質區別SQL&#xff08;結構化查詢語言&#xff09;數…

4、幽絡源微服務項目實戰:后端公共模塊創建與引入多租戶模塊

前言 上節我們將電網巡檢系統的前端vue2項目創建、配置&#xff0c;并構建了最基礎的多租戶界面&#xff0c;本節來繼續構建后端的公共模塊、多租戶模塊&#xff0c;并將公共模塊引入到多租戶模塊中。 創建公共模塊和多租戶模塊 在back父工程下創建兩個Module&#xff0c;和…

STM32學習路線開啟篇:芯片簡介與課程簡介

編寫不易,請多多指教,覺得不錯可以關注一下,相互學習 前言 一、課程配套資源 1、面包板 2、面包板專用的跳線 3、面包板的飛線 4、杜邦線 5、STM32F103C8T6最小系統板 6、0.96寸的OLED顯示屏模塊 7、電位器 8、按鈕 9、LED燈 10、STLINK 11、USB轉串口(TTL)模塊 12、源蜂鳴器模…

圖像直方圖

圖像直方圖就是用來統計圖像像素值分布的。灰度圖分布讀取灰度圖phone cv2.imread(phone.png, cv2.IMREAD_GRAYSCALE) a phone.ravel() plt.hist(a, bins256) plt.show()如何可以獲得當前像素值分布讀取各通道的像素值分布img cv2.imread(phone.png) colors (b, g, r) for …

分類別柱狀圖(Vue3)

效果圖&#xff1a;需求&#xff1a;男女年齡段占比<template><div class"go-ClassifyBar01"><v-chartref"vChartRef":option"option"style"width: 100%; height: 800px"></v-chart></div> </templa…

Apache Dubbo學習筆記-使用Dubbo發布、調用服務

Apache Dubbo經常作為一個RPC框架來使用&#xff0c;這篇文章主要介紹使用Dubbo配合注冊中心來發布和調用服務。 Apache Dubbo和Spring Boot、JDK的版本對應關系。 Dubbo 分支最新版本JDKSpring Boot組件版本詳細說明3.3.x (當前文檔)3.3.08, 17, 212.x、3.x詳情- 版本變更記錄…

Python學習——字典和文件

前面python的學習中我們已經學習了python的函數和列表元組相關的內容&#xff0c;接下來我們來學習剩下的python語法&#xff1a;字典和文件 相關代碼已經上傳到作者的個人gitee&#xff1a;樓田莉子/Python 學習喜歡請點個贊謝謝 目錄 字典 創建字典 查找key 新增/修改元素 …

swiper插件的使用

官方網址&#xff1a;https://www.swiper.com.cn/ 1、點擊導航欄&#xff0c;獲取Swiper里邊的下載Swiper 2、選擇要下載的版本【本次案例版本5.4.5】&#xff0c;然后解壓縮文件夾&#xff0c;拿到swiper.min.js和swiper.min.css文件&#xff0c;放到項目對應的css文件和js文…

Vue3+JS 組合式 API 實戰:從項目痛點到通用 Hook 封裝

Vue3 組合式 API 的實戰技巧 —— 組合式 API 幫我解決了不少 Options API 難以應對的問題&#xff0c;尤其是在代碼復用和復雜組件維護上。一、為什么放棄 Options API&#xff1f;聊聊三年項目里的真實痛點?剛接觸 Vue3 時&#xff0c;我曾因 “慣性” 繼續用 Options API 寫…

把 AI 塞進「電梯按鈕」——基于 64 kB 零樣本聲紋的離線故障預測按鈕

標簽&#xff1a;零樣本聲紋、電梯按鈕、離線 AI、TinyML、RISC-V、低功耗、GD32V303、故障預警 ---- 1. 背景&#xff1a;為什么按鈕要「聽聲音」&#xff1f; 全國 700 萬臺電梯&#xff0c;按鈕故障率 0.3 %/年&#xff0c;卻常出現&#xff1a; ? 機械卡滯、觸點氧化&…