本帖最后由 许培享 于 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[a],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[b],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[sheetname] # 定位表单
- 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]) # 测试是否准确
- 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[0])*3600+int(time_start[1])*60+int(time_start[2])
- 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[0] == 1 :
- count_now = count_now + str(int(((count_gap)%86400)/3600))+":"
- if time_show[1] == 1 :
- count_now = count_now + str(int(((count_gap)%3600)/60))+":"
- if time_show[2] == 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=[0,10,0]#开始时间(时,分,秒)
- time_show=[0,1,1]#是否显示(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("点名[1.1.2024]")
- 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图标,运行“点名”窗口正确!
|