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图标,运行“点名”窗口正确!
赞一个 赞一个 厉害厉害
页:
[1]