✨重磅!盹猫的个人小站正式上线啦~诚邀各位技术大佬前来探秘!✨

这里有:

 

  • 硬核技术干货:编程技巧、开发经验、踩坑指南,带你解锁技术新姿势!
  • 趣味开发日常:代码背后的脑洞故事、工具测评,让技术圈不再枯燥~
  • 独家资源分享:开源项目、学习资料包,助你打怪升级快人一步!

👉 点击直达→ 盹猫猫的个人小站 👈
🌟 来逛逛吧,说不定能挖到你正在找的技术宝藏哦~

目录

一、整体功能概述

二、核心技术栈

三、功能模块解析

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; • 机械卡滞、触点氧化&…