Python 智能机房签到体系:高效管理讲堂考勤

[复制链接]
发表于 2025-10-19 01:13:53 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
智能机房签到体系:高效管理讲堂考勤

   相干资源文件已经打包成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> 五、源码展示:

   西席服务端源码:
  1. import socket
  2. import threading
  3. import json
  4. import time
  5. import logging
  6. import queue
  7. import struct
  8. from tkinter import *
  9. from tkinter import ttk, messagebox, filedialog
  10. from openpyxl import Workbook
  11. logging.basicConfig(
  12.     level=logging.INFO,
  13.     format='%(asctime)s - %(levelname)s - %(message)s',
  14.     filename='server.log',
  15.     filemode='a'
  16. )
  17. def is_port_in_use(port, host='0.0.0.0'):
  18.     with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
  19.         s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  20.         return s.connect_ex((host, port)) == 0
  21. class ServerGUI:
  22.     PORT = 8888
  23.     HEARTBEAT_TIMEOUT = 60
  24.     HEARTBEAT_CHECK_INTERVAL = 15
  25.     def __init__(self):
  26.         self.window = Tk()
  27.         self.window.title("机房签到-教师端")
  28.         self.window.geometry("1024x768")
  29.         self.window.protocol("WM_DELETE_WINDOW", self.on_close)
  30.         # 状态管理
  31.         self.running = True
  32.         self.clients = {
  33.    
  34.    }  # {(computer, ip): tree_item}
  35.         self.last_activity = {
  36.    
  37.    }
  38.         self.client_sockets = []
  39.         self.server = None
  40.         self.socket_lock = threading.Lock()
  41.         self.update_queue = queue.Queue()
  42.         # 初始化组件
  43.         self._init_styles()
  44.         self._create_menu_bar()
  45.         self._create_auto_table()
  46.         self._create_taskbar()
  47.         # 网络初始化
  48.         if not self._init_network():
  49.             return
  50.         # 启动线程
  51.         self.accept_thread = threading.Thread(target=self.accept_clients, daemon=True)
  52.         self.heartbeat_thread = threading.Thread(target=self.heartbeat_checker, daemon=True)
  53.         self.accept_thread.start()
  54.         self.heartbeat_thread.start()
  55.         # GUI定时任务
  56.         self.update_time()
  57.         self.process_update_queue()
  58.         self.center_window()
  59.         self.window.mainloop()
  60.     def _init_styles(self):
  61.         self.style = ttk.Style()
  62.         self.style.theme_use('clam')
  63.         self.style.configure("Treeview",
  64.                             background="#F5F5F5",
  65.                             fieldbackground="#F5F5F5",
  66.                             rowheight=25,
  67.                             font=('微软雅黑', 10))
  68.         self.style.map("Treeview", background=[('selected', '#4A90E2')])
  69.     def _create_menu_bar(self):
  70.         menubar = Menu(self.window)
  71.         file_menu = Menu(menubar, tearoff=0)
  72.         file_menu.add_command(label="导出Excel", command=self.save_to_excel)
  73.         file_menu.add_separator()
  74.         file_menu.add_command(label="退出", command=self.on_close)
  75.         help_menu = Menu(menubar, tearoff=0)
  76.         help_menu.add_command(label="关于", command=self._show_about)
  77.         menubar.add_cascade(label="文件", menu=file_menu)
  78.         menubar.add_cascade(label="帮助", menu=help_menu)
  79.         self.window.config(menu=menubar)
  80.     def _create_auto_table(self):
  81.         container = ttk.Frame(self.window)
  82.         container.pack(fill=BOTH, expand=True, padx=8, pady=8)
  83.         columns = ("computer", "ip", "checkin_class", "checkin_student")
  84.         self.tree = ttk.Treeview(
  85.             container,
  86.             columns=columns,
  87.             show="headings",
  88.             selectmode="browse"
  89.         )
  90.         headers = [
  91.             ("computer", "计算机名", 180),
  92.             ("ip", "IP地址", 150),
  93.             ("checkin_class", "签到班级", 200),
  94.             ("checkin_student", "签到学生", 150)
  95.         ]
  96.         for col_id, col_text, min_width in headers:
  97.             self.tree.heading(col_id, text=col_text, anchor=CENTER)
  98.             self.tree.column(col_id, width=min_width, anchor=CENTER)
  99.         vsb = ttk.Scrollbar(container, orient="vertical", command=self.tree.yview)
  100.         hsb = ttk.Scrollbar(container, orient="horizontal", command=self.tree.xview)
  101.         self.tree.configure(yscrollcommand=vsb.set, xscrollcommand=hsb.set)
  102.         self.tree.grid(row=0, column=0, sticky="nsew")
  103.         vsb.grid(row=0, column=1, sticky="ns")
  104.         hsb.grid(row=1, column=0, sticky="ew")
  105.         container.grid_rowconfigure(0, weight=1)
  106.         container.grid_columnconfigure(0, weight=1)
  107.     def _create_taskbar(self):
  108.         taskbar = ttk.Frame(self.window)
  109.         taskbar.pack(fill=X, side=BOTTOM, pady=4)
  110.         self.checkin_count = ttk.Label(taskbar, text="已签到: 0")
  111.         self.checkin_count.pack(side=LEFT, padx=12)
  112.         self.time_label = ttk.Label(taskbar, text="")
  113.         self.time_label.pack(side=RIGHT, padx=12)
  114.     def _init_network(self):
  115.         if is_port_in_use(self.PORT):
  116.             messagebox.showerror("错误", f"端口 {
  117.      
  118.      self.PORT} 已被占用")
  119.             self.window.destroy(
复制代码
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表