使用 Tkinter + Requests 实现地理信息安全系统学习时长助手
✨重磅!盹猫的个人小站正式上线啦~诚邀各位技术大佬前来探秘!✨
这里有:
- 硬核技术干货:编程技巧、开发经验、踩坑指南,带你解锁技术新姿势!
- 趣味开发日常:代码背后的脑洞故事、工具测评,让技术圈不再枯燥~
- 独家资源分享:开源项目、学习资料包,助你打怪升级快人一步!
👉 点击直达→ 盹猫猫的个人小站 👈
🌟 来逛逛吧,说不定能挖到你正在找的技术宝藏哦~
目录
一、整体功能概述
二、核心技术栈
三、功能模块解析
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 控件管理
声明:代码在上方资源处获取,仅作为学习用途,请勿用作非法用途,还是提倡认真学习!