许培享 发表于 2024-1-2 21:42:19

Python自定义随机点名-附倒计时

本帖最后由 许培享 于 2024-1-2 21:45 编辑


基本功能
多班级切换电子表格(.xlsx)随机点名或数字等。同时,附加十分钟倒计时,可随时暂停或启停或重置;窗口可悬浮于屏幕。可控滑块选择(1~9)10%到90%的人数/数字参与随机选中。

说明①1~9滑块,按电子表格的从上到下的顺序对应选择10%(靠前)到90%(靠后)的人数/数字参与随机选中并显示为白色。但是全体名单100%均全部滚动并显示为黄色。

②多班级切换。与电子表格一致(源程序中可修改班级名称)



③倒计时可随时启停。

④班级选中后,由灰色变蓝色方可点击。

⑤显示倒计时。

⑥滚动显示全体名单(黄色),点名后,显示选中名单(白色)。

全文Python代码
import tkinter as tk
import openpyxl
import random
import time
import winsound
#------------------------------------------------------
def toggle_on_off():
    global toggle
    toggle = not toggle
    if toggle:# on 则计时
      watch()
#------------------------------------------------------
def watch():
    global name_data, _callback_id, label_name
    a = random.randint(0,len(name_data)-1)
    b = random.randint(0,len(name_display)-1)
    label_name.configure(text=name_data,font=text_font, fg="yellow")
    if toggle:
      _callback_id = root.after(100, watch)
    else:
      root.after_cancel(_callback_id)
      label_name.configure(text=name_display,font=text_font, fg="white", bg=color_bg)
#------------------------------------------------------
def excel(filename, sheetname):
    global name_data, name_display
    name_data.clear()
    name_display.clear()
    # 每次调用excel()要清除姓名数据缓存,避免换班点击点名多班混和显示
    num = 0
    wb = openpyxl.load_workbook(filename)# 打开Excel
    sheet = wb# 定位表单
    column = 1 # 名单在首列
    for row in range(2, sheet.max_row + 1): # 除去首行,从第二行开始      
      if sheet.cell(row, column).value == "": # 若有空行忽略掉
            continue
      name_data.append(sheet.cell(row, column).value)
      # 将第一列的每一行数值遍历添加到name_data列表中
      if num < int(v.get())*10: # 默认取前10存入显示列表,1*10---9*10
            name_display.append(sheet.cell(row, column).value)
            # print(name_display) # 测试是否准确
            num += 1
#------------------------------------------------------
def pauseB3():
    global count_state
    if count_state == 2:
      count_state = 3
def startB1():
    global count_state
    if count_state != 2:
      count_state = 1
def resetB2():
    global count_state
    count_state = 0
#------------------------------------------------------
def time_update():#更新时间
    global time_start,count_state,count_mength,count_gap,count_start,text_time,root
    if count_state == 0:
      count_mength = int(time_start)*3600+int(time_start)*60+int(time_start)
      count_gap = count_mength
    elif count_state == 1:
      count_start = time.time()
      count_state = 2
    elif count_state == 2:
      count_gap =count_mength-int(time.time()-count_start)
      if count_gap < 0:
            count_gap = 0
            winsound.Beep( 800, 700 ) # (音量? 时长)
            count_state = 4
    elif count_state == 3:
      count_mength = count_gap
      count_state = 4
    count_now = ""
    if time_show == 1 :
      count_now = count_now + str(int(((count_gap)%86400)/3600))+":"
    if time_show == 1 :
      count_now = count_now + str(int(((count_gap)%3600)/60))+":"
    if time_show == 1 :
      count_now = count_now + str(int((count_gap)%60))
    text_time["text"] = count_now
    root.after(100, time_update)
#------------------------------------------------------
def radio():
    rollcall.configure(text="点 名", width=8,state=tk.NORMAL, command=toggle_on_off)
    # 选中了班“点名”状态正常
    strvar.set(myclass.get())
    excel("D:\myclasses.xlsx",strvar.get())
    # 多班级学生名单电子表格,当前使用表为 strvar.get()
#======================================================
name_text = "点 名"
_callback_id = None
toggle = False
root = tk.Tk()
count_state = 0 #时间初始化
time_start=#开始时间(时,分,秒)
time_show=#是否显示(0为不显示,1为显示)(时,分,秒)
text_font = ( "宋体", 100 )
text_color = "yellow"
color_bg = "blue"
myclass=tk.IntVar()
strvar=tk.StringVar()
name_data = [] # 创建存储所有学生姓名的空列表
name_display = [] # 创建存储 ALL/部分 学生姓名的空列表
ed_name = [] # 创建一个 list 保存被抽到名字的同学
# root.overrideredirect(True) # 有无标题栏
root.attributes("-topmost",1) # 置顶窗口
root.iconbitmap("d:\edu.ico")
root.title("点名")
root.geometry("530x290+200+300")# 200,300是窗口左上角距离屏幕原点坐标
# 创建抽取到的同学姓名展示部分
frame = tk.Frame(root)    # ****创建⼀个主frame,‘长在’主root窗⼝上*****
frame.pack()
frame_l = tk.Frame(frame)
v = tk.StringVar()
tk.Scale(frame_l, from_=1, to=9, resolution=1, variable=v).pack()
frame_m = tk.Frame(frame)
frame_r = tk.Frame(frame)
frame_l.pack(side='left')
frame_m.pack(side='left')
frame_r.pack(side='left')
text_time = tk.Label(frame_r, text="TIME SHOW", font=text_font, fg="blue")
text_time.pack()
root.after(100, time_update)
label_name = tk.Label(frame_r, text=name_text,font=text_font, fg=text_color, bg=color_bg)
label_name.pack()
#-------------------Radiobutton------------------------
tk.Radiobutton(frame_m,text='3 班',width=4,activebackground='blue',bd=5,
                  indicatoron=False,variable=myclass,
                  value=3,command=radio,offrelief='groove',relief='flat').pack()
tk.Radiobutton(frame_m,text='805班',width=4,activebackground='blue',bd=5,
                  indicatoron=False,variable=myclass,
                  value=5,command=radio,offrelief='groove',relief='flat').pack()
tk.Radiobutton(frame_m,text='7 班',width=4,activebackground='blue',bd=5,
                  indicatoron=False,variable=myclass,
                  value=7,command=radio,offrelief='groove',relief='flat').pack()
tk.Radiobutton(frame_m,text='9 班',width=4,activebackground='blue',bd=5,
                  indicatoron=False,variable=myclass,
                  value=9,command=radio,offrelief='groove',relief='flat').pack()
tk.Button(frame_m,text="启动T",width=8,command=startB1).pack()
tk.Button(frame_m,text="暂停T",width=8,command=pauseB3).pack()
tk.Button(frame_m,text="重置T",width=8,command=resetB2).pack()
rollcall = tk.Button(frame_m,text="点 名", fg='blue',width=8,state=tk.DISABLED)
# DISABLED防止未选班而点名报错
rollcall.pack()
root.mainloop()

Mind+编辑
Python模式下,选中”代码“,创建py文件,双击后在编辑区粘贴以上代码。



当代码完成,运行很有可能报错如下,这是正常现象,大家通常都会出现。


按下面①②③手动安装库文件即可。重新运行py文件即可。如果出现其它库文件报错,观察上图,依下图①②③处理。



注1、86行,电子表格文件要指定具体磁盘位置。否则,Mind+因找不到文件报错。
2、105行是设置“点名”窗口是否置于其它窗口顶层。
3、106行可设置”点名“窗口的图标自定义图像。


生成exe可执行文件
1、在“点名”窗口运行正确的情况下,可以打包生成EXE文件。
2、按win+R,启动CMD黑窗口,安装pyinstaller。


3、执行如下命令行,生成EXE文件(稍等片刻)。D:\>pyinstaller -F -w -i edu.ico myTRC.py


4、从D:\(三个源文件:myTRC.py,myclasses.xlsx,edu.ico)进入D:\dist(exe文件所在位置)


5、双击myTRC.exe图标,运行“点名”窗口正确!



hnyzcj 发表于 2024-1-3 06:08:16

赞一个

木子呢 发表于 2024-1-3 10:14:36

赞一个

aYYSW8AepLLd 发表于 2024-1-7 15:40:34

厉害厉害
页: [1]
查看完整版本: Python自定义随机点名-附倒计时