主页 功能展示 下载中心 帮助与反馈 开发者文档
V6.0 · 双版本正式发布

课堂点名计时器

× 化学计时器

Chemistry Timer · Classroom Edition

课堂教学 抽签点名 实验计时 大屏考试 演示场景 学科融合 课堂教学 设计的课堂点名计时工具
主界面
// FEATURES

全面升级的功能体系

V6.0 带来全新交互范式,从浮球到批注画布,从自动化引擎到时间岛,每一处都经过精心打磨。

 核心功能

可配置遥控
随机抽签

打破传统点名限制,支持全局热键 Tab 随时唤起,完全不干扰 PPT 课件播放。内置防篡改权重算法,让课堂互动更公平、更高效。

  • 悬浮窗模式,兼容所有教学软件
  • 支持名单兼容导入与算法公平保障
  • 自动记录历史,防止连续重复抽取
  • 异步抽签窗口:屏幕中央弹出展示
// V6.0 NEW

全新特性一览

V6.0 采用 PyQt5 全面重构,带来流畅动画、毛玻璃效果、高 DPI 自适应。相比 P5.0 稳定版,功能更强大、交互更现代。

制作中 · 浮球工具栏 Making

全屏批注工具支持多色画笔、橡皮擦、白板模式等批注功能。附快捷抽签按键

制作中 · 自动化引擎 Making

可视化配置触发器与动作,倒计时结束后自动执行命令、抽签、切换主题等操作。

时间岛 NEW

右上角置顶实时时钟,鼠标悬停自动淡出穿透,支持拖动定位与颜色自定义。

异步抽签窗口 NEW

按下热键后,结果以精美动画弹窗在屏幕中央展示,蓝色流光环绕,自动淡出消失。

倒计时波纹特效 NEW

倒计时归零瞬间,红色辐射波纹从屏幕中央扩散,配合音效给予强烈视觉提示。

PyQt5 全面重构 NEW

底层从 Tkinter 升级至 PyQt5,流畅动画、毛玻璃效果、高 DPI 自适应全面支持。

// MORE TOOLS

更多实用工具

低干扰
低干扰模式
悬浮球低干扰模式

不使用时自动缩为悬浮球,点击展开主窗口,支持置顶显示,随时待命不遮挡课件。

随机抽签
随机抽签
智能权重抽签

防篡改权重算法,被抽中后概率衰减,自动重置,确保点名绝对公平。

全屏时钟
全屏时钟
沉浸式时钟

专为考试与实验设计的大屏时钟,清晰直观

倒计时
计时器
双路精准计时

正计时 A/B 双路并行,倒计时支持快速预设,归零时波纹特效+音效。

元素周期表
元素周期表
化学工具箱

集成高清元素周期表、相对原子质量查询及计算器,实验数据随手可得。

设置
个性设置
高度自定义

支持透明度、动画速度、热键、抽签速度等全面配置,亮色/暗色主题一键切换。

选择版本

所有版本完全免费 & 开源 · MIT License

V6.0 测试版:功能最新、交互最现代 | P5.0 正式版:经过充分测试、运行稳定 | 手机版:Android App,开发中

// WINDOWS
最新版本·建议下载
课堂点名计时器 V6 图标 BETA

课堂点名计时器

V6.0 · PyQt5 · Windows x64

  • 全新 PyQt5 架构,流畅动画
  • 多种算法全方位升级
  • 可视化自动化引擎
  • 软件内名单维护系统
  • 波纹特效 + 音效
  • 毛玻璃效果、高 DPI 自适应
蓝奏云下载(密码:0000)
化学计时器 P5 图标 STABLE

化学计时器

P5.0 · Tkinter · Windows x64/x32

  • 样式简单专一
  • 安装即用,无需安装环境
  • 包含完整素材与名单
  • 全局热键抽签 + 元素周期表
  • 多路计时器 + 全屏时钟
  • 轻量级、低资源占用
蓝奏云下载(密码:0000)
化学计时器在线版图标

化学计时器 · 在线版

正计时 · 倒计时、元素周期表

立即使用
// MOBILE

将课堂工具装进口袋,随时随地使用。Android 原生 App,基于 Flutter 构建。

课堂点名计时器 App 图标

课堂点名计时器·App

PREVIEW

Android APK · Flutter · arm64

  • 随机抽签 · 倒计时 · 正计时
  • 全屏时钟,适配手机展示
  • 本地数据存储,无需网络
  • 暗色 / 亮色主题切换

当前为预览版,功能尚不完善,不建议依赖使用。
安装前请在手机设置中开启「允许安装未知来源应用」。蓝奏云密码:0000。

扫码下载

手机扫码下载

化学计时器在线版图标

化学计时器 · 在线版

正计时 · 倒计时、元素周期表

立即使用
// CHANGELOG

版本历程

从一节化学课的灵感,到双版本正式发布,再到手机 App 开发启航。

手机版 AppPREVIEW2026

基于 Flutter 构建的 Android 原生 App 首个预览版发布。涵盖随机点名、倒计时 / 正计时 / 番茄钟、双组秒表、全屏时钟等核心功能,支持亮色 / 暗色主题切换,数据完全本地存储。

V6.0BETA2025

底层从 Tkinter 全面升级至 PyQt5,引入流畅动画与毛玻璃效果。抽签算法全面重构,新增自动化引擎、时间岛、异步抽签窗口、全屏批注画布、倒计时波纹特效,支持高 DPI 自适应与软件内名单维护。

P5.0STABLE2025

防篡改权重算法正式落地,被抽中后概率衰减、自动重置,确保公平。系统版本体系完善,确立为面向化学教学的核心稳定版,全面覆盖课堂定位需求。

V3.0 — V4.02024

全局热键随机抽签上线,无需切换窗口即可完成点名。Pyinstaller 打包为安装包,实现一键安装即用,开始在多所学校课堂中推广应用。

V2.02024

随机抽签功能正式上线,引入权重算法,抽签结果更公平。新增专属抽签页面,支持名单导入与结果展示,课堂互动体验大幅提升。

V1.02024.10.26

项目启动。源于一节化学课上的灵感,用 Python + Tkinter 实现基础计时功能,经 Pyinstaller 打包后首次在班级课堂中完成测试。

* V6.0 为测试版,部分非核心功能维护中;P5.0 为稳定正式版。

SuangSue

化学计时器在线版图标

化学计时器·在线版

无需下载安装,打开即用。支持正计时、倒计时、元素周期表查询。

00:00:00.00

正计时

00:05:00

倒计时

元素周期表

元素周期表

点击图片全屏查看

📧

没找到想解决的问题?

欢迎将你的问题或建议发送至
[email protected] · 我们会尽快回复

开发者?查看 插件开发指南,了解如何为课堂点名计时器编写扩展插件。

快速上手

GETTING STARTED
01

下载并安装软件

前往下载中心选择版本:V6.0(功能最新)或 P5.0(运行最稳定)。下载后双击安装包,按提示完成安装,无需配置环境。

02

启动后找到悬浮球

程序启动后屏幕左下角出现圆形悬浮球,可随意拖动。点击展开主窗口,再次点击收起。无操作 30 秒后自动贴边隐藏,鼠标靠近即可唤出。

03

导入班级名单

切换到随机抽签页,点击「导入名单」选择 .txt / .xlsx / .csv / .docx 文件,或直接拖入窗口。支持多个班级名单,下拉切换。

04

开始使用

一切就绪!按 Tab 键随时唤出全局抽签,在计时器页设置倒计时,在时钟页开启全屏大屏时钟。

🎲

随机抽签

RANDOM PICK
01

导入 / 切换名单

点击随机抽签页右上角「导入名单」,选择 .txt / .xlsx / .csv / .docx 文件,或直接将文件拖入窗口。导入后在顶部下拉框可随时切换不同班级名单。

02

修改 / 删除名单内容

在查看名单中点击修改名单可直接编辑;点击删除名单可删除此名单。

03

进行抽签

Tab 键(全局生效,不影响 PPT)或点击「抽取」按钮触发抽签。可在下方选择抽取 1 名、2 名,或点击「✎ 修改」自定义最多 10 名。

04

重置抽取记录

抽签页底部点击「重置抽取记录」可将所有人的被抽次数清零,权重恢复均等。此操作不可撤销,请确认后再操作。

05

修改抽签热键

进入设置页,找到「抽签快捷键」,点击后按下任意新按键(F1–F12、字母、方向键等)即可更换,自动保存。

小技巧:将翻页笔上的空闲按键(例如映射为Tab的按键)设为快捷键,即可使用翻页笔快捷遥控抽签。

⏱️

计时器

TIMER
01

正计时 A/B 双路

切换到「正计时」,提供 A、B 两路独立秒表可同时运行。支持开始、暂停、继续、重置操作,精度达毫秒级。

02

倒计时

点击 +/- 调整时间,或点击预设按钮快速累加(10秒/30秒/5分/10分/60分)。归零时触发红色波纹特效和提示音,剩余 10 秒时数字变橙色警示。

🕐

全屏时钟

FULLSCREEN CLOCK
01

进入全屏时钟

在主窗口顶部导航点击「时钟」页,点击「全屏显示」按钮,时钟将覆盖整个屏幕,显示当前时间与日期,适合考试、实验等大屏展示场景。

02

退出全屏

点击右上角「退出全屏」按钮,或按 Esc / Enter / Space 任意键退出。

🛠️

实用工具

TOOLS
01

开启 / 关闭全局批注 V6

在「实用工具」页点击「启用批注」开关,屏幕边缘出现工具栏。点击颜色按钮选择画笔颜色,然后在屏幕任意位置书写。点击「选择」按钮切换回鼠标穿透模式,批注不影响其他操作。点击「清除」可一键擦除所有标注。

02

配置时间岛 V6

在「实用工具」页找到「时间岛」卡片,点击「显示」开关启用。拖动屏幕上的时间岛到合适位置;点击「详情」可开启背景框、调整文字颜色与透明度。鼠标悬停到时间岛上时它会自动淡出,方便操作下方内容。

03

调整界面设置

点击主窗口右上角齿轮图标进入设置页。可调整:悬浮球透明度、动画速度、抽签热键、界面缩放比例(修改后需重启生效)、异步抽签弹窗的显示时长。

常见问题

FAQ

点击问题展开答案。如未找到答案,欢迎发邮件至 [email protected]

通用问题
软件打开后找不到窗口?
软件启动后默认只显示悬浮球(屏幕左下角的圆形图标),不会直接弹出主窗口。点击悬浮球即可展开主界面。找不到悬浮球请查看任务栏右下角托盘区,右键托盘图标选择「显示主窗口」。
Tab 热键和其他软件冲突怎么办?
在设置页找到「抽签快捷键」,点击按钮后按下你想要的新热键(支持 F1-F12、字母、方向键、组合键等),自动保存生效。推荐使用 F9 或 CapsLock 等不常用按键。
名单文件格式要求是什么?
P5版本只可读取.txt文件。.txt 文件每行写一个姓名,必须以 UTF-8 编码保存(可用记事本另存为时选择 UTF-8)。V6.0兼容.txt、.docx、.xlsx/.xls 等多种文件,表格任意列写姓名,从第一行开始。
程序无法开机自启动?
新版本已经修复此问题,请重新下载,或将程序加入Startup文件夹中
V6 和 P5 有什么区别,该下载哪个?
V6.0 基于 PyQt5 全面重构,有流畅动画、时间岛等新功能,属于测试版。P5.0 是经长期验证的稳定版,功能完整、运行可靠,推荐初次使用或对稳定性要求高的场景。
软件关闭后下次打开名单还在吗?
是的,名单数据会自动保存在本地。下次启动软件后,上次导入的所有名单和抽签记录都会自动恢复,无需重新导入。
P5版本程序缩放有误,部分按键无法点击。
由于系统dpi受限,暂时无法解决,可以在配置文件中修改设置项,然后尝试重启软件。。
如何同时管理多个班级名单?
每次点击「导入名单」选择不同文件,软件会将其作为独立名单添加到下拉列表中,文件名即为名单名称。点击顶部下拉框可随时切换班级,各名单的抽签记录互相独立。
抽签弹窗的显示时间太短 / 太长怎么调?
进入设置页,找到「弹窗显示时长」滑块,向左拖动缩短显示时间,向右拖动延长。设置即时生效,下次抽签时生效。
倒计时结束后没有声音?
请检查:① 系统音量是否已静音;② 确认使用的是倒计时模式而非正计时模式。
V6.0界面显示太小 / 太大怎么调整?
进入设置页,找到「界面缩放」选项,调整到合适比例后重启软件后生效。推荐在 4K 高分屏上设置为 150% 或 200%。
🐛

已知问题

KNOWN ISSUES

以下为各版本目前已知的问题,我们正在积极修复,请留意后续更新。

V6.0 测试版
自动化引擎与全局批注工具无法使用制作中
该功能目前仍在开发阶段,V6.0 中已预留入口但尚未正式启用。预计在后续版本中正式上线,敬请期待。
V5.3(P5)稳定版
名单导入失败 / 显示乱码
P5 版本要求导入的 .txt 名单文件必须以 UTF-8 编码保存。如果名单出现乱码或导入失败,请用记事本打开名单文件,点击「文件 → 另存为」,在底部编码下拉框中选择 UTF-8 后保存,再重新导入即可。
🔌

插件开发指南

课堂点名计时器支持通过插件系统扩展功能。本文档将引导你编写、部署和分发自己的插件。

📋

概述

OVERVIEW

课堂点名计时器 (ClassroomTimer) 支持通过插件系统扩展功能。插件分为三个层级:

层级存放位置属性说明
系统内置plugins/__init__.py 中的 BUILTINS 列表builtin=True, system=True核心功能,不可移除,如时间岛
捆绑插件项目源码 plugins/*.pybundled=True随发行包分发,显示在"插件市场",用户可开关
用户插件%APPDATA%/ClassroomTimer/plugins/*.pybundled=False用户自行拖放安装,支持热更新
🚀

快速开始

QUICK START

创建一个 .py 文件,文件开头用注释声明元数据,然后实现生命周期函数:

# @name: 我的插件
# @icon: 🔧
# @desc: 这是插件的功能描述,会在主界面中展示。

def on_load(app):
    """插件首次加载时调用(应用启动时)。"""
    print("插件已加载")

def on_enable(app):
    """用户点击"启用"按钮时调用。"""
    print("插件已启用")

def on_disable(app):
    """用户点击"停用"按钮时调用。"""
    print("插件已停用")
🏷️

元数据注释

METADATA
字段必需格式说明
# @name:任意文本插件显示名称
# @icon:单个 emoji插件图标,默认 🧩
# @desc:任意文本功能描述,显示在卡片中

元数据注释必须放在文件最开头,一旦遇到非注释行即停止解析。

🔄

生命周期函数

LIFECYCLE
函数签名调用时机
on_load(app)应用启动时,PluginManager 初始化完成后
on_enable(app)用户在"工具&插件"页面点击"启用"时
on_disable(app)用户在"工具&插件"页面点击"停用"时

app 参数是 main.py 中的 App 实例,提供以下可用接口:

📦

App 对象常用属性

APP API
app._main_win        # MainWindow 主窗口实例
app._ball            # FloatingBall 浮球实例
app._anno_bar        # AnnotationToolbar 批注工具栏
app._anno_canvas     # AnnotationCanvas 批注画布(懒加载,可能为 None)
app._whiteboard      # WhiteboardCanvas 白板画布(懒加载,可能为 None)
app._time_island     # TimeIslandWidget 时间岛(懒加载)
app._island_panel    # TimeIslandDetailPanel 时间岛详情面板(懒加载)
app._async_win       # AsyncPickWindow 异步抽签窗口
app._pick_flash      # PickFlashOverlay 抽签闪光效果
app._fast_mode       # bool 快速模式
app._animation_enabled # bool 自动化全局开关
app._plugin_mgr      # PluginManager 插件管理器
🔧

常用工具模块

UTILITIES
from utils import config as cfg     # 配置读写
from utils import logger as log      # 日志输出
from utils.config import get_resource_dir  # 获取资源目录
⚙️

配置读写

CONFIG
from utils import config as cfg

cfg.get('key', default)          # 读取配置
cfg.set('key', value)            # 写入配置(自动持久化)
cfg.load()                       # 返回完整配置字典
cfg.save({'key': 'val'})         # 批量写入
cfg.load_roster('name')          # 加载名单
cfg.save_roster('name', list)    # 保存名单
📝

日志

LOGGING
from utils import logger as log

log.info('消息')
log.warning('警告')
log.error('错误')
log.debug('调试')
💡

完整示例:一个有功能的插件

EXAMPLE
# @name: 计时提醒
# @icon: ⏰
# @desc: 每隔指定分钟数弹出一个托盘提醒,帮助教师把控课堂节奏。

from PyQt5.QtCore import QTimer
from PyQt5.QtWidgets import QSystemTrayIcon

_INTERVAL = 5 * 60 * 1000  # 5分钟

_timer = None

def on_load(app):
    """初始化但不启动。"""
    pass

def on_enable(app):
    """启动定时器。"""
    global _timer
    _timer = QTimer()
    _timer.setInterval(_INTERVAL)
    _timer.timeout.connect(lambda: _notify(app))
    _timer.start()
    from utils import logger as log
    log.info('计时提醒插件已启动')

def on_disable(app):
    """停止定时器并清理。"""
    global _timer
    if _timer:
        _timer.stop()
        _timer = None

def _notify(app):
    """发送托盘通知。"""
    tray = None
    for w in app._app.topLevelWidgets():
        if hasattr(w, '_tray'):
            tray = w._tray
            break
    if tray:
        tray.showMessage('计时提醒', '已经过了预设时间,请注意课堂节奏。',
                         QSystemTrayIcon.Information, 3000)
📤

部署与分发

DEPLOYMENT

方式一:作为捆绑插件(随发行包分发)

.py 文件放入项目 plugins/ 目录,并在 rollcall.spec 中添加:

hiddenimports 中添加 'plugins.你的文件名'
datas 中已包含 ('plugins', 'plugins'),无需额外修改

应用启动时通过 get_resource_dir() / 'plugins' 扫描加载。

方式二:作为用户插件(拖放安装)

用户将 .py 文件拖放到"工具&插件"页面的虚线拖放区域,系统自动复制到 %APPDATA%/ClassroomTimer/plugins/ 并立即识别显示。

方式三:手动安装

.py 文件放入 %APPDATA%/ClassroomTimer/plugins/ 目录,应用会通过 QFileSystemWatcher 在 ~150ms 内自动检测并加载。

🔄

热更新机制

HOT RELOAD

用户插件目录由 QFileSystemWatcher 实时监控:

操作触发方式效果
新增拖放或复制 .py 到目录plugin_added 信号 → 界面新增卡片
删除从目录删除 .pyplugin_removed 信号 → 界面移除卡片
修改覆盖已有文件需重启应用生效(当前版本不热重载代码)
⚠️

注意事项

NOTES
  1. 文件名 = 插件 IDhello_world.py 的插件 ID 为 hello_world,保持唯一且不与内置插件冲突
  2. 以下划线开头 (_foo.py) 的文件会被忽略,不会被加载为插件
  3. 编码:文件必须以 UTF-8 编码保存
  4. 不阻塞主线程on_load / on_enable / on_disable 在主线程中同步调用,避免在回调中执行耗时操作
  5. 第三方依赖:如果插件依赖额外库(如 requests),需确保目标环境已安装
  6. PyQt5 可用:插件运行在 Qt 事件循环中,可直接使用 PyQt5 的 QTimer、信号槽等
  7. 不存在默认开启:所有插件的 enabled 初始状态为 False,除非在 config.json 中有保存状态
💾

插件状态持久化

STATE PERSISTENCE

用户对插件的启用/停用状态自动保存在配置中:

插件配置字段
time_islandconfig.jsonisland_enabled 字段
annotationconfig.jsonannotation_enabled 字段
automationconfig.jsonautomation_enabled 字段
其他插件config.jsonplugin_states 字典

PluginManager.save_enabled_state() 在每次切换时自动调用,无需手动处理。

您当前为移动端,要查看课堂点名计时器 App 的功能展示吗?