今天,编写的一个童年游戏厅中的一个简单游戏——水果机。类似于大转盘一样,一个选定框随着时间在转盘上循环,玩家点击停止,选定框停下来,所选择的水果为最后的结果。
1.首先导入包
import tkinter
import threading
import time
2.建立基础的游戏界面,这里使用tikinter包的Tk类来帮我们创建对象
root = tkinter.Tk()
root.title('水果机')
root.minsize(300, 300)
3.摆放按钮,总计12种水果选项,由于代码类似就不一一展示了
btm1 = tkinter.Button(root, text="榴莲", bg="red")
btm1.place(x=20, y=20, width=50, height=50)
btm2 = tkinter.Button(root, text="葡萄", bg="pink")
btm2.place(x=90, y=20, width=50, height=50)
...
btm12 = tkinter.Button(root, text="菠萝", bg="pink")
btm12.place(x=20, y=90, width=50, height=50)
4.绘制开始与结束按钮,当用户点击开始时系统调用newtask函数,当用户点击停止时系统调用stop函数
btm13 = tkinter.Button(root, text="开始", bg="pink", command=newtask)
btm13.place(x=90, y=125, width=50, height=50)
btm14 = tkinter.Button(root, text="停止", bg="pink", command=stop)
btm14.place(x=160, y=125, width=50, height=50)
5.编写开始newtask函数,首先调用全局变量isloop和stops,首先每次开始时必须将stops设置为False,这样确保在用户每次点击开始时程序都可以正常做出反应,然后使用threading.Thread创建一个线程来运行run函数,然后使线程开始运行,并且将isloop设置为True
def newtask():
global isloop
global stops
stops = False
t = threading.Thread(target=run)
t.start()
isloop =True
6.编写run函数,这里要对所有的全局变量进行使用,首先执行一个判断,如果用户多次点击按钮式,就会创建线程调用run,那么如果isloop的值为True的话说明,目前已经有一个线程正在执行run函数,那么没必要执行直接返回上级。然后设定一个int值i这里用来跟踪选择框,使用该i值来确定选择框的当前位置,然后进入循环,time设定0.01s的延迟,这样肉眼是无法跟踪的,然后使用for循环来遍历整个水果btn列表,将所有的水果框颜色变为red,然后再将当前位置i的水果框颜色变为green,由于每次循环时i都会自增1所以相当于循环了一次,然后在i到达边界12是设定一个if判断将I的重新归为1,这样就能实现多次循环。最后当stips的值为True低证明用户点击了停止按钮,程序将isloop的值重新归为False然后将此事的i值作为最后的结果存入stopid中结束循环。
def run ():
global isloop
global stops
global stopid
if isloop == True:
return
i = 1
if isinstance(stopid, int):
i = stopid
while True:
time.sleep(0.01)
for x in fruit_lists:
x['bg'] = 'red'
fruit_lists[i-1]['bg']='green'
print('当前位置:', i)
i += 1
if i > len(fruit_lists):
i = 0
if stops == True:
isloop = False
stopid = i
break
7.编写stop函数,同理如果检测到多次点击结束按键,系统直接返回上级
def stop():
global stops
if stops == True:
return
stops = True