page contents

Python实现地理信息安全在线考试系统学习时长助手

在在线学习系统中,学习时长往往是课程考核的关键指标。但手动挂机学习效率低,且需要不断点击页面保持在线。本文将介绍如何利用 Python 的 Tkinter GUI 库 和 Requests 网络请求库,编写一个自动化的“学习时长助手”,实现自动登录、验证码识别与刷新,以及后台定时提交学习时长。

attachments-2025-09-6KvMisKq68c4caef6fa4b.png在在线学习系统中,学习时长往往是课程考核的关键指标。但手动挂机学习效率低,且需要不断点击页面保持在线。本文将介绍如何利用 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.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=...) 更清晰、更易维护。

四、关键难点与解决方案

  1. 避免 GUI 阻塞

  • 所有耗时操作(网络请求、循环任务)均在子线程中运行,通过 queue.Queue 与主线程通信。
  • 主线程仅负责界面刷新,保持响应流畅。

验证码加载延迟

  • 验证码刷新时禁用按钮,待加载完成后再启用。

安全退出

  • 关闭窗口时,若后台线程还在运行,需先设置 stop_event,确保线程安全退出。

五、总结

通过本项目,我们不仅实现了一个实用的“学习时长助手”,还系统性地运用了以下技术点:

  • Tkinter GUI 设计与控件布局
  • Requests 会话管理与 POST 请求
  • 多线程与队列结合,解决 Tkinter 线程安全问题
  • 状态机模式简化复杂 UI 控件管理

更多相关技术内容咨询欢迎前往并持续关注好学星城论坛了解详情。

想高效系统的学习Python编程语言,推荐大家关注一个微信公众号:Python编程学习圈。每天分享行业资讯、技术干货供大家阅读,关注即可免费领取整套Python入门到进阶的学习资料以及教程,感兴趣的小伙伴赶紧行动起来吧。

attachments-2022-05-rLS4AIF8628ee5f3b7e12.jpg


你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
Pack
Pack

1368 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 2200 文章
  3. Pack 1370 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章