6581浏览
查看: 6581|回复: 3

[项目分享] Python自定义随机点名-附倒计时

[复制链接]
本帖最后由 许培享 于 2024-1-2 21:45 编辑

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

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

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


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


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

倒计时可随时启停。

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

显示倒计时。

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

全文Python代码
  1. import tkinter as tk
  2. import openpyxl
  3. import random
  4. import time
  5. import winsound
  6. #------------------------------------------------------
  7. def toggle_on_off():
  8.     global toggle
  9.     toggle = not toggle
  10.     if toggle:  # on 则计时
  11.         watch()
  12. #------------------------------------------------------
  13. def watch():
  14.     global name_data, _callback_id, label_name
  15.     a = random.randint(0,len(name_data)-1)
  16.     b = random.randint(0,len(name_display)-1)
  17.     label_name.configure(text=name_data[a],font=text_font, fg="yellow")
  18.     if toggle:
  19.         _callback_id = root.after(100, watch)
  20.     else:
  21.         root.after_cancel(_callback_id)
  22.         label_name.configure(text=name_display[b],font=text_font, fg="white", bg=color_bg)
  23. #------------------------------------------------------
  24. def excel(filename, sheetname):
  25.     global name_data, name_display
  26.     name_data.clear()
  27.     name_display.clear()
  28.     # 每次调用excel()要清除姓名数据缓存,避免换班点击点名多班混和显示
  29.     num = 0
  30.     wb = openpyxl.load_workbook(filename)  # 打开Excel
  31.     sheet = wb[sheetname]  # 定位表单
  32.     column = 1 # 名单在首列
  33.     for row in range(2, sheet.max_row + 1): # 除去首行,从第二行开始        
  34.         if sheet.cell(row, column).value == "": # 若有空行忽略掉
  35.             continue
  36.         name_data.append(sheet.cell(row, column).value)  
  37.         # 将第一列的每一行数值遍历添加到name_data列表中
  38.         if num < int(v.get())*10: # 默认取前10存入显示列表,1*10---9*10
  39.             name_display.append(sheet.cell(row, column).value)
  40.             # print(name_display[num]) # 测试是否准确
  41.             num += 1
  42. #------------------------------------------------------
  43. def pauseB3():
  44.     global count_state
  45.     if count_state == 2:
  46.         count_state = 3
  47. def startB1():
  48.     global count_state
  49.     if count_state != 2:
  50.         count_state = 1
  51. def resetB2():
  52.     global count_state
  53.     count_state = 0
  54. #------------------------------------------------------
  55. def time_update():#更新时间
  56.     global time_start,count_state,count_mength,count_gap,count_start,text_time,root
  57.     if count_state == 0:
  58.         count_mength = int(time_start[0])*3600+int(time_start[1])*60+int(time_start[2])
  59.         count_gap = count_mength
  60.     elif count_state == 1:
  61.         count_start = time.time()
  62.         count_state = 2
  63.     elif count_state == 2:
  64.         count_gap =  count_mength-int(time.time()-count_start)
  65.         if count_gap < 0:
  66.             count_gap = 0
  67.             winsound.Beep( 800, 700 ) # (音量? 时长)
  68.             count_state = 4
  69.     elif count_state == 3:
  70.         count_mength = count_gap
  71.         count_state = 4
  72.     count_now = ""
  73.     if time_show[0] == 1 :
  74.         count_now = count_now + str(int(((count_gap)%86400)/3600))+":"
  75.     if time_show[1] == 1 :
  76.         count_now = count_now + str(int(((count_gap)%3600)/60))+":"
  77.     if time_show[2] == 1 :
  78.         count_now = count_now + str(int((count_gap)%60))
  79.     text_time["text"] = count_now
  80.     root.after(100, time_update)
  81. #------------------------------------------------------
  82. def radio():
  83.     rollcall.configure(text="点 名", width=8,state=tk.NORMAL, command=toggle_on_off)
  84.     # 选中了班“点名”状态正常
  85.     strvar.set(myclass.get())
  86.     excel("D:\myclasses.xlsx",strvar.get())
  87.     # 多班级学生名单电子表格,当前使用表为 strvar.get()
  88. #======================================================
  89. name_text = "点 名"
  90. _callback_id = None
  91. toggle = False
  92. root = tk.Tk()
  93. count_state = 0 #时间初始化
  94. time_start=[0,10,0]#开始时间(时,分,秒)
  95. time_show=[0,1,1]#是否显示(0为不显示,1为显示)(时,分,秒)
  96. text_font = ( "宋体", 100 )
  97. text_color = "yellow"
  98. color_bg = "blue"
  99. myclass=tk.IntVar()
  100. strvar=tk.StringVar()
  101. name_data = [] # 创建存储所有学生姓名的空列表
  102. name_display = [] # 创建存储 ALL/部分 学生姓名的空列表
  103. ed_name = [] # 创建一个 list 保存被抽到名字的同学
  104. # root.overrideredirect(True) # 有无标题栏
  105. root.attributes("-topmost",1) # 置顶窗口
  106. root.iconbitmap("d:\edu.ico")
  107. root.title("点名[1.1.2024]")
  108. root.geometry("530x290+200+300")# 200,300是窗口左上角距离屏幕原点坐标
  109. # 创建抽取到的同学姓名展示部分
  110. frame = tk.Frame(root)    # ****创建⼀个主frame,‘长在’主root窗⼝上*****
  111. frame.pack()
  112. frame_l = tk.Frame(frame)
  113. v = tk.StringVar()
  114. tk.Scale(frame_l, from_=1, to=9, resolution=1, variable=v).pack()
  115. frame_m = tk.Frame(frame)
  116. frame_r = tk.Frame(frame)
  117. frame_l.pack(side='left')
  118. frame_m.pack(side='left')
  119. frame_r.pack(side='left')
  120. text_time = tk.Label(frame_r, text="TIME SHOW", font=text_font, fg="blue")
  121. text_time.pack()
  122. root.after(100, time_update)
  123. label_name = tk.Label(frame_r, text=name_text,font=text_font, fg=text_color, bg=color_bg)
  124. label_name.pack()
  125. #-------------------Radiobutton------------------------
  126. tk.Radiobutton(frame_m,text='3 班',width=4,activebackground='blue',bd=5,
  127.                     indicatoron=False,variable=myclass,
  128.                     value=3,command=radio,offrelief='groove',relief='flat').pack()
  129. tk.Radiobutton(frame_m,text='805班',width=4,activebackground='blue',bd=5,
  130.                     indicatoron=False,variable=myclass,
  131.                     value=5,command=radio,offrelief='groove',relief='flat').pack()
  132. tk.Radiobutton(frame_m,text='7 班',width=4,activebackground='blue',bd=5,
  133.                     indicatoron=False,variable=myclass,
  134.                     value=7,command=radio,offrelief='groove',relief='flat').pack()
  135. tk.Radiobutton(frame_m,text='9 班',width=4,activebackground='blue',bd=5,
  136.                     indicatoron=False,variable=myclass,
  137.                     value=9,command=radio,offrelief='groove',relief='flat').pack()
  138. tk.Button(frame_m,text="启动T",width=8,command=startB1).pack()
  139. tk.Button(frame_m,text="暂停T",width=8,command=pauseB3).pack()
  140. tk.Button(frame_m,text="重置T",width=8,command=resetB2).pack()
  141. rollcall = tk.Button(frame_m,text="点 名", fg='blue',width=8,state=tk.DISABLED)
  142. # DISABLED防止未选班而点名报错
  143. rollcall.pack()
  144. root.mainloop()
复制代码


Mind+编辑
Python模式下,选中”代码“,创建py文件,双击后在编辑区粘贴以上代码。
Python自定义随机点名-附倒计时图5



当代码完成,运行很有可能报错如下,这是正常现象,大家通常都会出现。
Python自定义随机点名-附倒计时图7


按下面①②③手动安装库文件即可。重新运行py文件即可。如果出现其它库文件报错,观察上图,依下图①②③处理。
Python自定义随机点名-附倒计时图6



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


生成exe可执行文件
1、在“点名”窗口运行正确的情况下,可以打包生成EXE文件。
2、按win+R,启动CMD黑窗口,安装pyinstaller。
Python自定义随机点名-附倒计时图9


3、执行如下命令行,生成EXE文件(稍等片刻)。D:\>pyinstaller -F -w -i edu.ico myTRC.py
Python自定义随机点名-附倒计时图12


4、从D:\(三个源文件:myTRC.py,myclasses.xlsx,edu.ico)进入D:\dist(exe文件所在位置)
Python自定义随机点名-附倒计时图10


5、双击myTRC.exe图标,运行“点名”窗口正确!
Python自定义随机点名-附倒计时图11



hnyzcj  版主

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

赞一个
回复

使用道具 举报

木子呢  管理员

发表于 2024-1-3 10:14:36

赞一个
回复

使用道具 举报

aYYSW8AepLLd  初级技匠

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

厉害厉害
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail