用python制作抽学号抽奖程序
本帖最后由 hnyzcj 于 2022-4-1 20:48 编辑【创意起源】
班级年级在一些节假日活动中存在一些抽奖、抽号的环节,为此我根据实际活动的需要将抽奖、抽号合并功能合并,用python制作了一个抽奖抽号的程序。
【使用的库】 本程序中使用了pygame、random、os 和 time库,其中【Pygame】是被设计用来写游戏的python模块集合,使用python可以导入pygame来开发具有全部特性的游戏和多媒体软件,本程序中我们使用了Pygame图形化界面。【random】是用于产生并运用随机数的标准库。Python中的主要使用是让其掌握在程序中运用随机数的能力。本程序中生产抽奖抽号的随机数字序列。【os】是与操作系统相关的标准库。如:文件,目录,执行系统命令等。【time】运行访问多种类型的时钟,这些时钟用于不同的场景。
【编程思路】 本程序主要由主界面、抽学号界面、抽奖界面构成,具体功能入下图4所示。
【配置编程环境】 打开Mind+软件,切换到Mind+软件的 Python 模式,Python 模式如下图5切换到 Python 模式后,我们点击右侧文件目录,在“电脑中的文件” 中添加文件。点击位置如下图6数字序列①“添加本地文件夹”,我们在自己设定的路径下新建“原代码”文件夹用来存放 Python 程序和编程所需的素材。选中该文件夹后点击确定,建立一个python程序的编程环境。之后,我们点击新建文件,即可在当前文件夹下创建 Python 程序 。我们这里创建了三个python程序,其名称为RunME_V1.1.py(主程序界面),choujiang_v20.1.py(抽奖程序界面),chouxuehao.py(抽学号程序界面)如图7所示抽学号抽奖程序需要用的第三方库分别是【pygame】,安装方法如下:在 Mind+软件的右上角点击库管理按钮,之后会看到的界面,在推荐库一栏提供了大部分常用第三方库,可以一键安装,我们点击“游戏”分类库下面的 【pygame】库进行安装,安装完毕会看到“已安装” 的提示字样,表明安装完成,如下图 8
【添加素材】 本程序中使用到了图片、声音等素材文件,要将其拷贝到“原文件”文件夹下。如下图9所示。其中FZYTK.TTF为字库文件,TT.wav为程序中音频文件,其余图片为背景图片及抽奖等级图片,name.txt为存储学生姓名的文档。
【制作主界面】 打开RunME_V1.1.py输入下列程序,注意chouxuehao():和choujiang():函数中我们写的是调用EXE文件,后续需要将相关文件由py格式打包成exe格式。<font size="4"><font size="4">import pygame
import random
import time
import os
pygame.init()
from pygame.locals import *
sc = pygame.display.set_mode((400,600))
bg = pygame.image.load("bg.png")
font = pygame.font.Font("FZYTK.ttf",40)
font1 = pygame.font.Font("FZYTK.ttf",30)
font_color=(0,0,0)
sc.blit(bg,(0,0))
pygame.display.update()
text_1 = font1.render("选择您需要的功能:",True,font_color)
sc.blit(text_1,(65,20))
text_xuehao = font.render("抽序号",True,font_color)
sc.blit(text_xuehao,(140,160))
text_xuehao = font.render("抽奖",True,font_color)
sc.blit(text_xuehao,(140,400))
pygame.display.update()
def chouxuehao():
os.startfile("chouxuehao.exe")
def choujiang():
os.startfile("choujiang_v20.1.exe")
while True:
#sc.blit(num,(100,20))
x,y = pygame.mouse.get_pos()
for event in pygame.event.get():
if event.type == QUIT:
pygame.display.quit()
exit()
if event.type == MOUSEBUTTONDOWN:
if 130 < x < 270 and 150 < y <210:
chouxuehao()
if 130 < x < 230 and 390 < y <450:
choujiang()</font></font>
【制作抽学号界面】
打开chouxuehao.py输入下列程序,该部分程序运行顺序为:打开待抽学号学生信息文件,输入学生姓名,(如果不需要学生姓名信息忽略此步)如图10所示,进入设置抽取人数界面如图12所示,输入将要抽取的学生人数后点击界面进入抽学号界面,单击任意位置进行学号抽取如图13所示,若要对背景进行更换可在输入抽取人数位置,点击“换装”进行背景更换。
<font size="4">import pygame
import random
import time
import os
pygame.init()
from pygame.locals import *
la = []
sc = pygame.display.set_mode((400,600))
bg = pygame.image.load("bg.png")
pygame.display.set_caption("抽学号")
font = pygame.font.Font("FZYTK.ttf",60)
font1 = pygame.font.Font("FZYTK.ttf",30)
font2 = pygame.font.Font("FZYTK.ttf",20)
ifend = False
ifnamed = False
font_color = (0,0,0)
sc.blit(bg,(0,0))
pygame.display.update()
iss = True
a2 = ""
n_num = 0
name = font2.render("单击此处将打开记事本", True, font_color)
name1 = font2.render("编辑序号对应的姓名", True, font_color)
name2 = font2.render("每个姓名占一行", True, font_color)
ifnonext =font2.render("如果无需姓名则立即下一步", True, font_color)
ne_st = font2.render("单击回车下一步", True, font_color)
clickto = font2.render("单击任意位置抽序号", True, font_color)
namelist = []
ifendname = False
#encoding = "utf-8"
while True:#读txt
sc.blit(bg,(0,0))
sc.blit(name,(120,100))
sc.blit(name1,(120,130))
sc.blit(name2,(120,160))
sc.blit(ifnonext,(120,185))
sc.blit(ne_st,(120,300))
for event in pygame.event.get():
x,y = pygame.mouse.get_pos()
if event.type == QUIT:
pygame.display.quit()
exit()
if event.type == MOUSEBUTTONDOWN:
if 120<x<320 and 100<y<120:
os.system("name.txt")
ifnamed = True
if event.type == KEYDOWN:
if event.key == K_RETURN:
if ifnamed == True:
f = open("name.txt","r",encoding = "utf-8")
for line in f:
namelist.append(line)
ifendname = True
if ifnamed == False:
ifendname = True
pygame.display.update()
if ifendname == True:
#print(1)
break
sc.blit(bg,(0,0))
while True:
num = font1.render("请输入抽取人数:", True, font_color)
text_changing = font1.render("换装",True,font_color)
sc.blit(num,(100,20))
sc.blit(text_changing,(0,0))
x,y = pygame.mouse.get_pos()
for event in pygame.event.get():
if event.type == QUIT:
pygame.display.quit()
exit()
if event.type == MOUSEBUTTONDOWN:
if 0<x<65 and 0<y<30:
#sc1 = pygame.display.set_mode((400,600))
text_1 = font1.render("选择您想使用的背景",True,font_color)
text_nd = font1.render("红色",True,font_color)
text_mid_a = font1.render("绿色",True,font_color)
text_chny = font1.render("蓝色",True,font_color)
text_child = font1.render("黄色",True,font_color)
text_white = font1.render("无",True,font_color)
text_few = font1.render("""敬请期待,单击此处返回""",True,font_color)
while True:
sc.blit(bg,(0,0))
sc.blit(text_1,(65,5))
sc.blit(text_nd,(65,40))
sc.blit(text_mid_a,(65,75))
sc.blit(text_chny,(65,110))
sc.blit(text_child,(65,145))
sc.blit(text_white,(65,180))
sc.blit(text_few,(65,350))
if ifend == True:
sc.blit(bg,(0,0))
pygame.display.update()
break
for event in pygame.event.get():
x,y = pygame.mouse.get_pos()
if event.type == QUIT:
pygame.display.quit()
exit()
if event.type == MOUSEBUTTONDOWN:
if ifend == False:
if 65<x<395 and 350<y<380:
ifend = True
elif 65<x<155 and 40<y<70:
bg = pygame.image.load("r.png")
font_color = (0,0,0)
elif 65<x<155 and 75<y<105:
bg = pygame.image.load("g.png")
font_color = (255,255,255)
elif 65<x<125 and 110<y<140:
bg = pygame.image.load("b.png")
font_color = (255,0,0)
elif 65<x<155 and 145<y<175:
bg = pygame.image.load("y.png")
font_color = (0,0,0)
elif 65<x<100 and 180<y<210:
bg = pygame.image.load("bg.png")
font_color = (0,0,0)
pygame.display.update()
if event.type == KEYDOWN:
if event.key == K_RETURN:
a2 = a2
sc.blit(bg,(0,0))
pygame.display.update()
#n_num = str(n_num) + a2
n_num = 1
else:
a2 = a2+chr(event.key)
text_1 = font.render(a2, True, font_color)
sc.blit(text_1, (100, 80))
if n_num == 1:
break
pygame.display.update()
#start()
sc.blit(bg,(0,0))
pygame.display.update()
for i in range(int(a2)+1):
la.append(i)
if ifendname == True and namelist == []:
for i in range(int(a2)+1):
namelist.append("")
del la
num = font1.render("请输入序号数:", True, font_color)
text_changing = font1.render("换装",True,font_color)
while True:
sc.blit(bg,(0,0))
sc.blit(clickto,(110,200))
for event in pygame.event.get():
if event.type == QUIT:
pygame.display.quit()
exit()
if len(la) == 0:
end = font.render("抽完了", False, font_color)
sc.blit(end,(120,285))
pygame.display.update()
time.sleep(2)
pygame.display.quit()
exit()
if event.type == MOUSEBUTTONDOWN:
xuehaoindex = random.randint(0,len(la)-1)
xuehao = la
chosename = namelist
text_1 = font.render(str(xuehao)+"号", False, font_color)
nameprinted = font.render(chosename, False, font_color)
sc.blit(text_1, (140, 280))
sc.blit(nameprinted,(120,345))
pygame.display.update()
time.sleep(1.5)
sc.blit(bg,(0,0))
pygame.display.update()
del la
del namelist
pygame.display.update()</font>【制作抽奖界面】 打开choujiang_v20.1.py输入下列程序,该部分程序运行顺序为:输入各等级学生数量,(我们这里初始设置三个等级数量为5,输入值不应该超过5)如图14所示,进入抽奖界面,单击任意位置进行抽奖如图15所示,若要对背景进行更换可在输入等级人数位置,点击“换装”进行背景更换。<font size="4">import pygame
import random
import time
pygame.init()
from pygame.locals import *
a1 = ""
a2 = ""
a3 = ""
t1 = 0
t2 = 0
t3 = 0
e1 = 0
e2 = 0
e3 = 0
l1 = 0
l2 = 0
l3 = 0
la = []
n_num = 0
iffirst3 = True
iffirst2 = True
iffirst1 = True
sc = pygame.display.set_mode((400,600))
#bg = pygame.image.load("Untitled.png")
bg = pygame.image.load("bg.png")
pygame.display.set_caption("抽奖")
font = pygame.font.Font("FZYTK.ttf",30)
font1 = pygame.font.Font("FZYTK.ttf",15)
font_color=(50,155,20)
#sc.blit(bg,(0,0))
sc.fill((255,255,255))
pygame.display.update()
iss = True
ifend = False
text_changing = font1.render("换装",True,font_color)
def sound():
pygame.mixer.music.load("TT.wav")
pygame.mixer.music.play(-1,0.0)
sound()
"""================================num input================================"""
while True:
sc.blit(text_changing,(0,0))
x,y = pygame.mouse.get_pos()
if iss == False:
break
else:
for event in pygame.event.get():
if event.type == QUIT:
pygame.display.quit()
exit()
if event.type == MOUSEBUTTONDOWN:
if 0<x<35 and 0<y<20:
#sc1 = pygame.display.set_mode((400,600))
text_1 = font.render("选择您想使用的背景",True,font_color)
text_nd = font.render("红色",True,font_color)
text_mid_a = font.render("绿色",True,font_color)
text_chny = font.render("蓝色",True,font_color)
text_child = font.render("黄色",True,font_color)
text_white = font.render("无",True,font_color)
text_few = font.render("""敬请期待,单击此处返回""",True,font_color)
while True:
sc.blit(bg,(0,0))
sc.blit(text_1,(65,5))
sc.blit(text_nd,(65,40))
sc.blit(text_mid_a,(65,75))
sc.blit(text_chny,(65,110))
sc.blit(text_child,(65,145))
sc.blit(text_white,(65,180))
sc.blit(text_few,(65,350))
if ifend == True:
sc.blit(bg,(0,0))
pygame.display.update()
break
for event in pygame.event.get():
x,y = pygame.mouse.get_pos()
if event.type == QUIT:
pygame.display.quit()
exit()
if event.type == MOUSEBUTTONDOWN:
if ifend == False:
if 65<x<395 and 350<y<380:
ifend = True
elif 65<x<155 and 40<y<70:
bg = pygame.image.load("r.png")
font_color = (0,0,0)
elif 65<x<155 and 75<y<105:
bg = pygame.image.load("g.png")
font_color = (255,255,255)
elif 65<x<125 and 110<y<140:
bg = pygame.image.load("b.png")
font_color = (255,0,0)
elif 65<x<155 and 145<y<175:
bg = pygame.image.load("y.png")
font_color = (0,0,0)
elif 65<x<100 and 180<y<210:
bg = pygame.image.load("bg.png")
font_color = (0,0,0)
pygame.display.update()#changing(bg,False)
if n_num == 0:
start = font.render("请输入各奖项人数", True, font_color)
text = font.render("三等奖:", True, font_color)
sc.blit(start,(100,10))
sc.blit(text,(100,50))
if event.type == KEYDOWN:
if event.key == K_RETURN:
a3 = int(a3)
n_num = n_num + 1
else:
a3 = a3+chr(event.key)
text_1 = font.render(a3, True, font_color)
sc.blit(text_1, (100, 80))
elif n_num == 1:
text = font.render("二等奖:",True,font_color)
sc.blit(text,(100,155))
if event.type == KEYDOWN:
if event.key == K_RETURN:
n_num = n_num + 1
a2 = int(a2)
else:
a2 = a2+chr(event.key)
text_1 = font.render(a2, True, font_color)
sc.blit(text_1, (100, 185))
elif n_num == 2:
text = font.render("一等奖:",True,font_color)
sc.blit(text,(100,255))
if event.type == KEYDOWN:
if event.key == K_RETURN:
a1 = int(a1)
iss = False
else:
a1 = a1+chr(event.key)
text_1 = font.render(a1, True, font_color)
sc.blit(text_1, (100, 285))
pygame.display.update()
"""==================================list add============================"""
for i in range(5):
la.append("一等奖")
for i in range(5):
la.append("二等奖")
for i in range(5):
la.append("三等奖")
#print(la)
"""=================================main start============================"""
def end():
sc.blit(bg,(0,0))
text = font.render("结束",True,font_color)
sc.blit(text,(170,285))
pygame.display.update()
time.sleep(1)
pygame.display.quit()
exit()
def award_1():
ta = "一等奖"
wow = pygame.image.load("wow.png")
award = font.render(ta,True,font_color)
sc.blit(award,(155,325))
sc.blit(wow,(130,10))
#t2 = t2+1
#l1 = l1+1
def award_2():
ta = "二等奖"
cool = pygame.image.load("02.png")
award = font.render(ta,True,font_color)
sc.blit(award,(155,325))
sc.blit(cool,(130,40))
#t2 = t2+1
#l2 = l2+1
def award_3():
ta = "三等奖"
cool = pygame.image.load("03.png")
award = font.render(ta,True,font_color)
sc.blit(award,(155,325))
sc.blit(cool,(130,40))
#t3 = t3+1
#l3 = l3+1
while True:
if la == []:
sc.blit(bg,(0,0))
text = font.render("结束",True,font_color)
sc.blit(text,(170,285))
pygame.display.update()
time.sleep(1)
pygame.display.quit()
exit()
if t1+t2+t3 == a1+a2+a3:
pygame.display.quit()
exit()
#aw = random.randint(0,len(la)-1)
#ta = la
#pygame.init()
#bg = pygame.image.load("Untitled.jpg")
sc.blit(bg,(0,0))
#pygame.display.update()
text = font.render("点击抽奖",True,font_color)
sc.blit(text,(140,285))
#pygame.display.update()
pygame.display.update()
for event in pygame.event.get():
x,y = pygame.mouse.get_pos()
if event.type == QUIT:
pygame.display.quit()
exit()
if event.type == MOUSEBUTTONDOWN:
aw = random.randint(0,len(la)-1)
ta = la
if ta == "三等奖":
if e3 == 0:
if l3 == 3: #重复判断
if e2 == 0:
award_2()
l2 = l2+1
elif e1 == 0:
award_1()
l1 = l1+1
elif e3 == 0:
award_3()
l3 = l3+1
elif l3 == 0:
if iffirst3 == True :
award_3()
l3 = l3+1
iffirst3 = False
elif iffirst3 == False:
if e2 == 0:
award_2()
l2 = l2+1
elif e1 == 0:
award_1()
l1 = l1+1
else:
award_3()
l2 = l2+1
if e3 != 0 :
if e2 == 1 and e1 == 1:
end()
if e2 == 0:
award_2()
l2 = l2+1
elif e1 == 0:
award_1()
l1 = l1+1
elif ta == "二等奖":
if e2 == 0:
if l2 ==2:#重复2
if e3 == 0:
award_3()
l3 = l3+1
elif e1 == 0:
award_1()
l1 = l1+1
elif e2 == 0:
award_2()
l2 = l2+1
elif l2 == 0:
if iffirst2 == True :
award_2()
l2 = l2+1
iffirst2 = False
elif iffirst2 == False:
if e1 == 0:
award_1()
l1 = l1+1
elif e3 == 0:
award_3()
l3 = l3+1
else:
award_2()
l2 = l2+1
if e2 != 0 :
if e3 == 1 and e1 == 1:
end()
if e1 == 0:
award_1()
l1 = l1+1
elif e3 == 0:
award_3()
l3 = l3+1
elif ta == "一等奖":
if e1 == 0:
if l1 == 1:
if e2 == 0:
award_2()
l2 = l2+1
elif e3 == 0:
award_3()
l3 = l3+1
elif e1 == 0:
award_1()
l1 = l1+1
elif l1 == 0:
if iffirst1 == True :
award_1()
l1 = l1+1
iffirst1 = False
elif iffirst1 == False:
if e2 == 0:
award_2()
l2 = l2+1
elif e3 == 0:
award_3()
l3 = l3+1
else:
award_1()
l1 = l1+1
if e1 != 0 :
if e2 == 1 and e3 == 1:
end()
if e2 == 0:
award_2()
l2 = l2+1
elif e3 == 0:
award_3()
l3 = l3+1
pygame.display.update()
time.sleep(1)
if ta == "一等奖":
t1 = t1+1
print("picked1")
if ta == "二等奖":
t2 = t2+1
print("picked2")
if ta == "三等奖":
t3 = t3+1
print("picked3")
if t1 == a1 and e1 == 0:
la.remove("一等奖")
#emp1 = font.render("一等奖抽完啦!",True,(0,0,0))
#sc.blit(emp1,(95,5))
#la.append(0)
e1 = 1
if t2 == a2 and e2 == 0:
la.remove("二等奖")
la.remove("二等奖")
#emp2 = font.render("二等奖抽完啦!",True,(0,0,0))
#sc.blit(emp2,(95,38))
e2 = 1
if t3 == a3 and e3 == 0:
la.remove("三等奖")
la.remove("三等奖")
la.remove("三等奖")
la.remove("三等奖")
la.remove("三等奖")
#emp3 = font.render("三等奖抽完啦!",True,(0,0,0))
#sc.blit(emp1,(95,71))
e3 = 1
pygame.display.update()
if la == []:
sc.blit(bg,(0,0))
text = font.render("结束",True,font_color)
sc.blit(text,(170,285))
pygame.display.update()
time.sleep(1)
pygame.display.quit()
exit()
if t1+t2+t3 == a1+a2+a3:
pygame.display.quit()
exit()</font>【py转换exe】 安装pyinstaller,打开cmd窗口,输入pip install pyinstaller,命令行输出successfully表示成功。运行cmd, 打开py文件所在的目录。如C:\code输入pyinstaller -F **.py即可。此时,我们可以看到,在code原始脚本的同级目录下,生成了build和dist文件夹,其中dist文件夹下存放我们想要的exe程序。
666,get到了 6666666666 赞赞赞赞赞 厉害厉害 呵呵呵呵 哈哈哈哈 有用。。。 可以再整一个“抽学号答题”的玩意儿{:5_116:} 诩 发表于 2022-4-13 11:21
可以再整一个“抽学号答题”的玩意儿
好收到你的建议 hnyzcj 发表于 2022-4-13 12:33
好收到你的建议
。。。
(我就开个玩笑嘛……) 诩 发表于 2022-4-13 12:50
。。。
(我就开个玩笑嘛……)
不过也没关系,可以防止学生上课不听讲。
不知道可不可以用cmd:
点到哪个学生(如果是在线课的话)就自动解除静音并开启摄像头,
看看是不是也是“不经常在线”的一员
( ̄y▽ ̄)╭ Ohohoho.....
页:
[1]