当前位置:   article > 正文

【tkinter】抽卡模拟小程序_python抽卡模拟器

python抽卡模拟器

前言

今天教大家如何用python内置模块tkinter创建一个图形化界面且实现模拟抽卡的功能,效果如下:

导入模块

  1. import tkinter as tk
  2. import time,random

创建GridApp类,并往里面添加各个函数

初始化函数

  1. class GridApp:
  2. def __init__(self, root):
  3. self.root = root #引用主窗口对象
  4. self.colors = [] # 保存格子颜色的列表
  5. self.buttons = [] # 保存格子的二维列表
  6. self.gifts = [] # 保存奖品的二维列表
  7. self.is_stop = True # 是否停止遍历的标志
  8. self.create_grid() # 创建网格
  9. self.create_start_button() # 创建开始格子
  10. self.root.config(bg="#b0e686") # 设置窗口背景色
  11. self.count = 0 # 记录次数
  12. self.data = [0,0,0,0] # 记录不同类型奖品的数量 [蓝,紫,金,总共]

创建网格

  1. def create_grid(self):# 创建网格
  2. for i in range(4):
  3. row = []
  4. for j in range(4):
  5. button = tk.Button(self.root, width=12, height=5, bg='yellowgreen',activebackground="yellowgreen")#添加一个格子按钮组件
  6. button.grid(row=i, column=j)#固定当前格子按钮
  7. row.append(button)#临时存放一条格子按钮数据
  8. self.buttons.append(row)#把所有格子按钮的数据存到实例变量方便之后调用
  9. label_1 = tk.Label(text="记录",bg="#b0e686",font=("华文彩云",20)).place(x=390,y=10)

在这个项目中,抽奖区域的格子我采用按钮的组件,这样子看起来更有立体感。

该函数用双层循环向屏幕添加按钮组件实现绘制4*4的网格,然后进行格子按钮数据的存放,再向窗口右上角添加文字标签“记录”

创建开始和停止按钮

  1. def create_start_button(self):# 创建开始按钮
  2. start_button = tk.Button(self.root, text='开始', command=self.start_traverse,width=10,height=3,bg="yellowgreen",relief="ridge", borderwidth=5)
  3. start_button.grid(row=5, column=6)
  4. def create_stop_button(self): # 创建停止按钮
  5. stop_button = tk.Button(self.root, text='停止', command=self.stop_traverse,width=10,height=3,bg="yellowgreen")
  6. stop_button.grid(row=5, column=6)

开始按钮中的参数relief以及borderwdth都是用来美化按钮的,对功能没有影响

而参数command对应的则是按下按钮时会触发的函数

设置奖品

  1. def set_gifts(self):# 设置奖品
  2. self.gifts=[[3]*4 for i in range(4)]
  3. random_row = random.randint(0, 3)
  4. random_col = random.randint(0, 3)
  5. self.gifts[random_row][random_col] = 5
  6. for i in range(2):
  7. random_row = random.randint(0, 3)
  8. random_col = random.randint(0, 3)
  9. if self.gifts[random_row][random_col] == 3:
  10. self.gifts[random_row][random_col] = 4

所有的格子下对应一个奖品,分别有13个蓝(3),2个紫(4),1个金(5),对每种奖品设置数字编号后便于之后的操作。先将所有的格子里放上蓝奖品(3),再从中随机挑选一个放上金奖品(5),最后进行两次循环,每次循环随机获得一个编号,若这个编号是3,也就是蓝奖品,将其改变成紫奖品(4)

开始抽奖

  1. def start_traverse(self):# 开始抽奖
  2. self.create_stop_button()#实现开始按钮按下后变成停止按钮
  3. self.set_gifts()#设置奖品
  4. self.is_stop = False#修改是否停止遍历的标志
  5. while self.is_stop == False:
  6. self.traverse_grid()#开始遍历网格
  7. time.sleep(0.01)
  8. self.reveal_grid(self.pre[0],self.pre[1])#循环停止时显示抽到的奖品

    按下开始按钮程序就执行此函数

停止抽奖

  1. def stop_traverse(self):# 停止抽奖
  2. self.create_start_button()#把停止按钮恢复为开始按钮
  3. self.is_stop = True#更新状态

重置格子

  1. def reset_grid(self):# 重置格子的颜色为黄绿色
  2. for i in range(4):
  3. for j in range(4):
  4. self.buttons[i][j].config(bg='yellowgreen')

没有重置格子颜色的后果:

显示抽奖结果

  1. def reveal_grid(self,row,col):# 显示抽奖结果
  2. num=self.gifts[row][col]#获取抽到的奖品编号
  3. dic = {3:["蓝",'#1cb6e0'],4:["紫",'#c670e0'],5:["金",'#fff000']}#字典dic存放不同奖品的信息
  4. self.data[num-3] += 1#更新抽到的各品种奖品的记录
  5. self.data[3] += 1#更新总抽奖次数
  6. self.buttons[row][col].config(bg=dic[num][1])#改变当前格子的颜色从而显示抽奖结果
  7. #利用self.count控制右侧始终显示最近十次记录
  8. if self.count == 10:
  9. self.count = 0
  10. tk.Label(bg="#b0e686",height=20,width=10).place(x=385,y=40)#利用无字标签遮档实现记录区域清空的效果
  11. self.count+=1
  12. #添加右侧界面的长方形小标签以及左下角的总记录标签
  13. tk.Label(text=dic[num][0],bg=dic[num][1],font=("黑体",15),width=6).place(x=390,y=30+self.count*30)
  14. tk.Label(text=f"蓝{self.data[0]}{self.data[1]}{self.data[2]} 总计{self.data[3]}",font=("黑体",20),fg="green",bg='#b0e686').place(x=10,y=410)

遍历网格

  1. def traverse_grid(self):# 遍历网格
  2. self.reset_grid()#重置格子颜色
  3. self.pre=[3,3]
  4. for row in range(4):
  5. for col in range(4):
  6. if not self.is_stop:
  7. self.buttons[row][col].config(bg='#72a700') # 设置当前按钮颜色为绿色
  8. self.buttons[self.pre[0]][self.pre[1]].config(bg='yellowgreen') # 恢复上一个按钮颜色为黄绿色
  9. time.sleep(0.01)#设置延时,使得画面不断更新呈现出滚动抽奖的效果,时间越长滚动越慢
  10. root.update()
  11. self.pre=[row,col]
  12. else: #若检测到已经按下停止按钮,退出函数
  13. return -1

这个函数会在开始抽奖函数中的while循环内反复调用,所以可以实现遍历到的方块运行到最后又返回到头上的效果,用time模块中的sleep()函数配合update()能产生动画效果

完整代码

将以上的GridApp类加入到主程序中就可以运行啦,完整代码如下

  1. import tkinter as tk
  2. import time,random
  3. class GridApp:
  4. def __init__(self, root):
  5. self.root = root #引用主窗口对象
  6. self.colors = [] # 保存格子颜色的列表
  7. self.buttons = [] # 保存格子的二维列表
  8. self.gifts = [] # 保存奖品的二维列表
  9. self.is_stop = True # 是否停止遍历的标志
  10. self.create_grid() # 创建网格
  11. self.create_start_button() # 创建开始格子
  12. self.root.config(bg="#b0e686") # 设置窗口背景色
  13. self.count = 0 # 记录次数
  14. self.data = [0,0,0,0] # 记录不同类型奖品的数量 [蓝,紫,金,总共]
  15. def create_grid(self):# 创建网格
  16. #1.双层循环实现绘制4*4的网格2.格子按钮数据的存放3.屏幕右上角添加文字标签“记录”
  17. for i in range(4):
  18. row = []
  19. for j in range(4):
  20. button = tk.Button(self.root, width=12, height=5, bg='yellowgreen',activebackground="yellowgreen")#添加一个格子按钮组件
  21. button.grid(row=i, column=j)#固定当前格子按钮
  22. row.append(button)#临时存放一条格子按钮数据
  23. self.buttons.append(row)#把所有格子按钮的数据存到实例变量方便之后调用
  24. label_1 = tk.Label(text="记录",bg="#b0e686",font=("华文彩云",20)).place(x=390,y=10)
  25. def create_start_button(self):# 创建开始按钮
  26. start_button = tk.Button(self.root, text='开始', command=self.start_traverse,width=10,height=3,bg="yellowgreen",relief="ridge", borderwidth=5)
  27. start_button.grid(row=5, column=6)
  28. def create_stop_button(self): # 创建停止按钮
  29. stop_button = tk.Button(self.root, text='停止', command=self.stop_traverse,width=10,height=3,bg="yellowgreen")
  30. stop_button.grid(row=5, column=6)
  31. def set_gifts(self):# 设置奖品
  32. #用二维数组self.gifts来存放每个格子对应的奖品的编号,分别为13个蓝(3),2个紫(4),1个金(5)
  33. self.gifts=[[3]*4 for i in range(4)]
  34. random_row = random.randint(0, 3)
  35. random_col = random.randint(0, 3)
  36. self.gifts[random_row][random_col] = 5
  37. for i in range(2):
  38. random_row = random.randint(0, 3)
  39. random_col = random.randint(0, 3)
  40. if self.gifts[random_row][random_col] == 3:
  41. self.gifts[random_row][random_col] = 4
  42. def start_traverse(self):# 开始抽奖
  43. #按下开始按钮执行此函数
  44. self.create_stop_button()#实现开始按钮按下后变成停止按钮
  45. self.set_gifts()#设置奖品
  46. self.is_stop = False#修改是否停止遍历的标志
  47. while self.is_stop == False:
  48. self.traverse_grid()#开始遍历网格
  49. time.sleep(0.01)
  50. self.reveal_grid(self.pre[0],self.pre[1])#循环停止时显示抽到的奖品
  51. def stop_traverse(self):# 停止抽奖
  52. self.create_start_button()
  53. self.is_stop = True
  54. def reset_grid(self):# 重置格子的颜色为黄绿色
  55. for i in range(4):
  56. for j in range(4):
  57. self.buttons[i][j].config(bg='yellowgreen')
  58. def reveal_grid(self,row,col):# 显示抽奖结果
  59. num=self.gifts[row][col]#获取抽到的奖品编号
  60. dic = {3:["蓝",'#1cb6e0'],4:["紫",'#c670e0'],5:["金",'#fff000']}#字典dic存放不同奖品的信息
  61. self.data[num-3] += 1#更新抽到的各品种奖品的记录
  62. self.data[3] += 1#更新总抽奖次数
  63. self.buttons[row][col].config(bg=dic[num][1])#改变当前格子的颜色从而显示抽奖结果
  64. #利用self.count控制右侧始终显示最近十次记录
  65. if self.count == 10:
  66. self.count = 0
  67. tk.Label(bg="#b0e686",height=20,width=10).place(x=385,y=40)#利用无字标签遮档实现记录区域清空的效果
  68. self.count+=1
  69. #添加右侧界面的长方形小标签以及左下角的总记录标签
  70. tk.Label(text=dic[num][0],bg=dic[num][1],font=("黑体",15),width=6).place(x=390,y=30+self.count*30)
  71. tk.Label(text=f"蓝{self.data[0]}{self.data[1]}{self.data[2]} 总计{self.data[3]}",font=("黑体",20),fg="green",bg='#b0e686').place(x=10,y=410)
  72. def traverse_grid(self):# 遍历网格
  73. self.reset_grid()#重置格子颜色
  74. self.pre=[3,3]
  75. for row in range(4):
  76. for col in range(4):
  77. if not self.is_stop:
  78. self.buttons[row][col].config(bg='#72a700') # 设置当前按钮颜色为绿色
  79. self.buttons[self.pre[0]][self.pre[1]].config(bg='yellowgreen') # 恢复上一个按钮颜色为黄绿色
  80. time.sleep(0.01)#设置延时,使得画面不断更新呈现出滚动抽奖的效果,时间越长滚动越慢
  81. root.update()
  82. self.pre=[row,col]
  83. else: #若检测到已经按下停止按钮,退出函数
  84. return -1
  85. root = tk.Tk()
  86. root.title("抽卡模拟器(1/16出金,1/8出紫)")#设置窗口标题
  87. app = GridApp(root)
  88. root.mainloop()

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/607078
推荐阅读
相关标签
  

闽ICP备14008679号