马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
智能机房签到体系:高效管理讲堂考勤
相干资源文件已经打包成EXE文件,可双击直接运行步调,且文章末端已附上相干源码,以供各人学习交换,博主主页另有更多Python相干步调案例,秉着开源精力的想法,望各人喜欢,点个关注不迷路!!!
一、概述
本机房签到体系(弟子端)是一个基于 Python 和 Tkinter 图形界面库开发的客户端软件,旨在资助弟子快速完成讲堂签到,并实时反馈签到状态。该软件通过网络通讯与西席端服务器保持毗连,确保签到数据的可靠性和实时性。
本体系具备 自动检测服务器IP、网络状态实时监测、心跳检测 以及 签到重试机制 等多项智能特性,旨在提供一个高效、便捷的签到体验,进步讲堂考勤的智能化管理程度。
<hr> 二、功能利用
1. 界面操持
- 窗口布局:
- 采取 Tkinter + ttk 组件构建,界面简便直观。
- 窗口巨细 420x320,不可调解巨细,确保界面雅观同一。
- 居中体现,进步用户体验。
- 输入框:
- 西席端IP输入:自动添补本机推测的西席端IP,可手动修改。
- 班级选择:提供 “七(1)班”~“七(6)班” 可选项,采取 下拉框。
- 姓名输入:限定 2-10 位中笔墨符,包管格式规范。
- 状态指示灯:
- 毗连乐成 (绿灯),未毗连 (红灯),直观体现毗连状态。
- 使命栏信息:
- 西席端毗连状态 体现,颜色区分状态(绿色=已毗连,赤色=未毗连)。
- 当前时间,每秒更新一次,提拔用户体验。
<hr> 2. 网络通讯
- 服务器IP检测:
- 自动检测当地IP,推测西席端IP,淘汰弟子输入错误大概性。
- 网络状态监测:
- 采取 双重检测机制 制止误判,每 1.5-3 秒举行一次检测。
- 状态变更时,界面 实时更新,确保弟子随时把握西席端毗连情况。
- 心跳机制:
- 每 30 秒 发送一次 “heartbeat”,保持与西席端的在线状态。
- 假如断开毗连,实验快速重连。
<hr> 3. 签到功能
- 签到流程:
- 点击 “立即签到” 按钮,软件会实行 服务器毗连检测,确保西席端可用。
- 查抄 IP 地点合法性、姓名输入格式,确保数据有用性。
- 采取 多线程 举行签到,防止界面卡顿。
- 签到哀求失败时,最多重试 5 次,渐渐增长耽误(指数退避)。
- 服务器相应:
- 乐成返回 签到乐成,弹窗提示,并自动关闭窗口。
- 失败时,体现 错误信息,提示用户查抄网络或接洽西席。
<hr> 三、效果展示
<hr> 四、总结
本机房签到体系(弟子端)以 简便雅观的界面、高效的网络管理 和 智能化签到机制 为核心,提供了一个稳固、易用的讲堂签到方案。其重要特点包罗:
✅ 自动检测服务器IP,低沉手动输入资源
✅ 实时网络监测,确保签到状态可视化
✅ 心跳机制保持在线,进步签到稳固性
✅ 高效的重试机制,淘汰签到失败影响
通过该体系,弟子可以快速完成签到,西席端也能高效获取签到数据,从而进步讲堂管理的服从和智能化程度。
<hr> 五、源码展示:
西席服务端源码:
- import socket
- import threading
- import json
- import time
- import logging
- import queue
- import struct
- from tkinter import *
- from tkinter import ttk, messagebox, filedialog
- from openpyxl import Workbook
-
- logging.basicConfig(
- level=logging.INFO,
- format='%(asctime)s - %(levelname)s - %(message)s',
- filename='server.log',
- filemode='a'
- )
-
- def is_port_in_use(port, host='0.0.0.0'):
- with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
- s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
- return s.connect_ex((host, port)) == 0
-
- class ServerGUI:
- PORT = 8888
- HEARTBEAT_TIMEOUT = 60
- HEARTBEAT_CHECK_INTERVAL = 15
-
- def __init__(self):
- self.window = Tk()
- self.window.title("机房签到-教师端")
- self.window.geometry("1024x768")
- self.window.protocol("WM_DELETE_WINDOW", self.on_close)
-
- # 状态管理
- self.running = True
- self.clients = {
-
- } # {(computer, ip): tree_item}
- self.last_activity = {
-
- }
- self.client_sockets = []
- self.server = None
- self.socket_lock = threading.Lock()
- self.update_queue = queue.Queue()
-
- # 初始化组件
- self._init_styles()
- self._create_menu_bar()
- self._create_auto_table()
- self._create_taskbar()
-
- # 网络初始化
- if not self._init_network():
- return
-
- # 启动线程
- self.accept_thread = threading.Thread(target=self.accept_clients, daemon=True)
- self.heartbeat_thread = threading.Thread(target=self.heartbeat_checker, daemon=True)
- self.accept_thread.start()
- self.heartbeat_thread.start()
-
- # GUI定时任务
- self.update_time()
- self.process_update_queue()
- self.center_window()
- self.window.mainloop()
-
- def _init_styles(self):
- self.style = ttk.Style()
- self.style.theme_use('clam')
- self.style.configure("Treeview",
- background="#F5F5F5",
- fieldbackground="#F5F5F5",
- rowheight=25,
- font=('微软雅黑', 10))
- self.style.map("Treeview", background=[('selected', '#4A90E2')])
-
- def _create_menu_bar(self):
- menubar = Menu(self.window)
- file_menu = Menu(menubar, tearoff=0)
- file_menu.add_command(label="导出Excel", command=self.save_to_excel)
- file_menu.add_separator()
- file_menu.add_command(label="退出", command=self.on_close)
- help_menu = Menu(menubar, tearoff=0)
- help_menu.add_command(label="关于", command=self._show_about)
- menubar.add_cascade(label="文件", menu=file_menu)
- menubar.add_cascade(label="帮助", menu=help_menu)
- self.window.config(menu=menubar)
-
- def _create_auto_table(self):
- container = ttk.Frame(self.window)
- container.pack(fill=BOTH, expand=True, padx=8, pady=8)
-
- columns = ("computer", "ip", "checkin_class", "checkin_student")
- self.tree = ttk.Treeview(
- container,
- columns=columns,
- show="headings",
- selectmode="browse"
- )
-
- headers = [
- ("computer", "计算机名", 180),
- ("ip", "IP地址", 150),
- ("checkin_class", "签到班级", 200),
- ("checkin_student", "签到学生", 150)
- ]
-
- for col_id, col_text, min_width in headers:
- self.tree.heading(col_id, text=col_text, anchor=CENTER)
- self.tree.column(col_id, width=min_width, anchor=CENTER)
-
- vsb = ttk.Scrollbar(container, orient="vertical", command=self.tree.yview)
- hsb = ttk.Scrollbar(container, orient="horizontal", command=self.tree.xview)
- self.tree.configure(yscrollcommand=vsb.set, xscrollcommand=hsb.set)
-
- self.tree.grid(row=0, column=0, sticky="nsew")
- vsb.grid(row=0, column=1, sticky="ns")
- hsb.grid(row=1, column=0, sticky="ew")
-
- container.grid_rowconfigure(0, weight=1)
- container.grid_columnconfigure(0, weight=1)
-
- def _create_taskbar(self):
- taskbar = ttk.Frame(self.window)
- taskbar.pack(fill=X, side=BOTTOM, pady=4)
-
- self.checkin_count = ttk.Label(taskbar, text="已签到: 0")
- self.checkin_count.pack(side=LEFT, padx=12)
-
- self.time_label = ttk.Label(taskbar, text="")
- self.time_label.pack(side=RIGHT, padx=12)
-
- def _init_network(self):
- if is_port_in_use(self.PORT):
- messagebox.showerror("错误", f"端口 {
-
- self.PORT} 已被占用")
- self.window.destroy(
复制代码 |