hnyzcj 发表于 2022-4-1 20:40:04

用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程序。

盐焗海盐 发表于 2022-4-2 20:43:10

666,get到了

赤星三春牛! 发表于 2022-4-2 22:07:35

6666666666

赤星三春牛! 发表于 2022-4-2 22:08:56

赞赞赞赞赞

赤星三春牛! 发表于 2022-4-2 22:10:17

厉害厉害

赤星三春牛! 发表于 2022-4-2 22:11:28

呵呵呵呵

赤星三春牛! 发表于 2022-4-2 22:12:33

哈哈哈哈

赤星三春牛! 发表于 2022-4-2 22:13:57

有用。。。

发表于 2022-4-13 11:21:56

可以再整一个“抽学号答题”的玩意儿{:5_116:}

hnyzcj 发表于 2022-4-13 12:33:48

诩 发表于 2022-4-13 11:21
可以再整一个“抽学号答题”的玩意儿

好收到你的建议

发表于 2022-4-13 12:50:06

hnyzcj 发表于 2022-4-13 12:33
好收到你的建议

。。。
(我就开个玩笑嘛……)

发表于 2022-4-13 12:52:10

诩 发表于 2022-4-13 12:50
。。。
(我就开个玩笑嘛……)

不过也没关系,可以防止学生上课不听讲。
不知道可不可以用cmd:
点到哪个学生(如果是在线课的话)就自动解除静音并开启摄像头,
看看是不是也是“不经常在线”的一员
( ̄y▽ ̄)╭ Ohohoho.....
页: [1]
查看完整版本: 用python制作抽学号抽奖程序