抽奖游戏运行一次只能抽一次,请问如何把他改成运行一次能抽10次或者无限次
抽奖游戏运行一次只能抽一次,请问如何把他改成运行一次能抽10次或者无限次谢谢
import tkinter
import time
import threading
class choujiang:
def __init__(self):
self.root = tkinter.Tk()
self.root.title('抽奖')
self.root.minsize(300, 300)
self.isloop = False
self.newloop = False
self.setwindow()
self.root.mainloop()
def setwindow(self):
self.btnstart = tkinter.Button(self.root, text="start/stop", command=self.newtask)
self.btnstart.place(x=90, y=125, width=80, height=50)
self.btn1 = tkinter.Button(self.root, text="apple", bg='white')
self.btn1.place(x=20, y=20, width=50, height=50)
self.btn2 = tkinter.Button(self.root, text="boy", bg='yellow')
self.btn2.place(x=90, y=20, width=50, height=50)
self.btn3 = tkinter.Button(self.root, text="coat", bg='blue')
self.btn3.place(x=160, y=20, width=50, height=50)
self.btn4 = tkinter.Button(self.root, text="dog", bg='black')
self.btn4.place(x=230, y=20, width=50, height=50)
self.btn5 = tkinter.Button(self.root, text="egg", bg='orange')
self.btn5.place(x=230, y=90, width=50, height=50)
self.btn6 = tkinter.Button(self.root, text="foot", bg='green')
self.btn6.place(x=230, y=160, width=50, height=50)
self.btn7 = tkinter.Button(self.root, text="girl", bg='#ccffff')
self.btn7.place(x=230, y=230, width=50, height=50)
self.btn8 = tkinter.Button(self.root, text="hat", bg='purple')
self.btn8.place(x=160, y=230, width=50, height=50)
self.btn9 = tkinter.Button(self.root, text="ice", bg='brown')
self.btn9.place(x=90, y=230, width=50, height=50)
self.btn10 = tkinter.Button(self.root, text="jelly", bg='skyblue')
self.btn10.place(x=20, y=230, width=50, height=50)
self.btn11 = tkinter.Button(self.root, text="key", bg='pink')
self.btn11.place(x=20, y=160, width=50, height=50)
self.btn12 = tkinter.Button(self.root, text="lion", bg='gray')
self.btn12.place(x=20, y=90, width=50, height=50)
self.list1 = [self.btn1, self.btn2, self.btn3, self.btn4, self.btn5, self.btn6, self.btn7, self.btn8, self.btn9,
self.btn10, self.btn11, self.btn12, ]
def rounds(self):
if self.isloop == True:
return
i = 0
while True:
if self.newloop == True:
self.isloop = False
return
time.sleep(0.1)
for each in self.list1:
each['bg'] = 'white'
self.list1['bg'] = 'white'
time.sleep(0.000001)
self.list1['bg'] = 'red'
i += 1
if i >= len(self.list1):
i = 0
def newtask(self):
if self.isloop == False:
t = threading.Thread(target=self.rounds)
t.start()
self.isloop = True
elif self.isloop == True:
self.isloop = False
self.newloop = True
c = choujiang()
要让抽奖游戏运行一次能抽10次或者无限次,需要对程序进行如下修改:
在 class choujiang 中添加计数器 self.count,初始值为0。
修改 newtask 方法,在按钮被点击后,将 self.count 加 10 或者加 1,表示可以抽奖的次数增加了。
修改 rounds 方法,在 while 循环中增加一个判断条件 self.count > 0,即还有剩余的抽奖次数,才会执行抽奖操作,并将 self.count 减 1。
修改后的代码如下:import tkinter
import time
import threading
class choujiang:
def __init__(self):
self.root = tkinter.Tk()
self.root.title('抽奖')
self.root.minsize(300, 300)
self.isloop = False
self.newloop = False
self.setwindow()
self.count = 0
self.root.mainloop()
def setwindow(self):
self.btnstart = tkinter.Button(self.root, text="start/stop", command=self.newtask)
self.btnstart.place(x=90, y=125, width=80, height=50)
self.btn1 = tkinter.Button(self.root, text="apple", bg='white')
self.btn1.place(x=20, y=20, width=50, height=50)
self.btn2 = tkinter.Button(self.root, text="boy", bg='yellow')
self.btn2.place(x=90, y=20, width=50, height=50)
self.btn3 = tkinter.Button(self.root, text="coat", bg='blue')
self.btn3.place(x=160, y=20, width=50, height=50)
self.btn4 = tkinter.Button(self.root, text="dog", bg='black')
self.btn4.place(x=230, y=20, width=50, height=50)
self.btn5 = tkinter.Button(self.root, text="egg", bg='orange')
self.btn5.place(x=230, y=90, width=50, height=50)
self.btn6 = tkinter.Button(self.root, text="foot", bg='green')
self.btn6.place(x=230, y=160, width=50, height=50)
self.btn7 = tkinter.Button(self.root, text="girl", bg='#ccffff')
self.btn7.place(x=230, y=230, width=50, height=50)
self.btn8 = tkinter.Button(self.root, text="hat", bg='purple')
self.btn8.place(x=160, y=230, width=50, height=50)
self.btn9 = tkinter.Button(self.root, text="ice", bg='brown')
self.btn9.place(x=90, y=230, width=50, height=50)
self.btn10 = tkinter.Button(self.root, text="jelly", bg='skyblue')
self.btn10.place(x=20, y=230, width=50, height=50)
self.btn11 = tkinter.Button(self.root, text="key", bg='pink')
self.btn11.place(x=20, y=160, width=50, height=50)
self.btn12 = tkinter.Button(self.root, text="lion", bg='gray')
self.btn12.place(x=20, y=90, width=50, height=50)
self.list1 = [self.btn1, self.btn2, self.btn3, self.btn4, self.btn5, self.btn6, self.btn7, self.btn8, self.btn9,
self.btn10, self.btn11, self.btn12, ]
def rounds(self):
if self.isloop == True:
return
i = 0
while self.count > 0: # 修改的地方
if self.newloop == True:
self.isloop = False
return
time.sleep(0.1)
for each in self.list1:
each['bg'] = 'white'
self.list1['bg'] = 'white'
time.sleep(0.000001)
self.list1['bg'] = 'red'
i += 1
if i >= len(self.list1):
i = 0
self.count -= 1 # 修改的地方
def newtask(self):
if self.isloop == False:
if self.count == 0: # 修改的地方
self.count = 10 # 修改的地方
t = threading.Thread(target=self.rounds)
t.start()
self.isloop = True
elif self.isloop == True:
self.isloop = False
self.newloop = True
c = choujiang()
以上修改后,点击 start/stop 按钮一次将会增加可以抽奖的次数,如果要无限抽奖可以直接修改方法 newtask 中的 self.count = 0 改为 self.count = float('inf') 或者其他较大的数字即可。 歌者文明清理员 发表于 2023-4-9 08:44
要让抽奖游戏运行一次能抽10次或者无限次,需要对程序进行如下修改:
在 class choujiang 中添加计数器...
哥,我复制了你给的代码还是只能运行一次呀,而且抽奖结果直接锁定在了同一结果上了,再帮我看看,谢谢哥 本帖最后由 isdkz 于 2023-4-9 10:01 编辑
我这个代码中将 self.newloop 重置为 False 实现无数次抽奖,有什么问题可以提出来
import tkinter
import time
import threading
class choujiang:
def __init__(self):
self.root = tkinter.Tk()
self.root.title('抽奖')
self.root.minsize(300, 300)
self.isloop = False
self.newloop = False
self.setwindow()
self.root.mainloop()
def setwindow(self):
self.btnstart = tkinter.Button(self.root, text="start", command=self.newtask) # 改了这里的text
self.btnstart.place(x=90, y=125, width=80, height=50)
self.btn1 = tkinter.Button(self.root, text="apple", bg='white')
self.btn1.place(x=20, y=20, width=50, height=50)
self.btn2 = tkinter.Button(self.root, text="boy", bg='yellow')
self.btn2.place(x=90, y=20, width=50, height=50)
self.btn3 = tkinter.Button(self.root, text="coat", bg='blue')
self.btn3.place(x=160, y=20, width=50, height=50)
self.btn4 = tkinter.Button(self.root, text="dog", bg='black')
self.btn4.place(x=230, y=20, width=50, height=50)
self.btn5 = tkinter.Button(self.root, text="egg", bg='orange')
self.btn5.place(x=230, y=90, width=50, height=50)
self.btn6 = tkinter.Button(self.root, text="foot", bg='green')
self.btn6.place(x=230, y=160, width=50, height=50)
self.btn7 = tkinter.Button(self.root, text="girl", bg='#ccffff')
self.btn7.place(x=230, y=230, width=50, height=50)
self.btn8 = tkinter.Button(self.root, text="hat", bg='purple')
self.btn8.place(x=160, y=230, width=50, height=50)
self.btn9 = tkinter.Button(self.root, text="ice", bg='brown')
self.btn9.place(x=90, y=230, width=50, height=50)
self.btn10 = tkinter.Button(self.root, text="jelly", bg='skyblue')
self.btn10.place(x=20, y=230, width=50, height=50)
self.btn11 = tkinter.Button(self.root, text="key", bg='pink')
self.btn11.place(x=20, y=160, width=50, height=50)
self.btn12 = tkinter.Button(self.root, text="lion", bg='gray')
self.btn12.place(x=20, y=90, width=50, height=50)
self.list1 = [self.btn1, self.btn2, self.btn3, self.btn4, self.btn5, self.btn6, self.btn7, self.btn8, self.btn9,
self.btn10, self.btn11, self.btn12, ]
def rounds(self):
if self.isloop == True:
return
i = 0
while True:
if self.newloop == True:
self.isloop = False
self.newloop = False # 加了这里
return
time.sleep(0.1)
for each in self.list1:
each['bg'] = 'white'
self.list1['bg'] = 'white'
time.sleep(0.000001)
self.list1['bg'] = 'red'
i += 1
if i >= len(self.list1):
i = 0
def newtask(self):
if self.isloop == False:
t = threading.Thread(target=self.rounds)
t.start()
self.btnstart['text'] = 'stop' # 加了这里
self.isloop = True
elif self.isloop == True:
self.isloop = False
self.newloop = True
time.sleep(1) # 加了这里
self.setwindow() # 加了这里
c = choujiang()
import tkinter
import time
import threading
import random
class choujiang:
def __init__(self):
self.root = tkinter.Tk()
self.root.title('抽奖')
self.root.minsize(300, 300)
self.isloop = False
self.newloop = False
self.setwindow()
self.result = tkinter.StringVar()
self.result.set('开始抽奖')
self.count = 0
self.root.mainloop()
def setwindow(self):
self.btnstart = tkinter.Button(self.root, text="开始", command=self.newtask)
self.btnstart.place(x=40, y=60, width=80, height=50)
self.btnend = tkinter.Button(self.root, text="停止", command=self.endtask)
self.btnend.place(x=180, y=60, width=80, height=50)
self.label_result = tkinter.Label(self.root, textvariable=self.result, font=('Arial', 24), fg='red')
self.label_result.place(x=70, y=150)
def randomRun(self):
i = 0
list1 = [" "," "," "," "," "," "," "," "," "," "," "," "]
while self.isloop == True:
if self.newloop == True:
self.isloop = False
return
time.sleep(0.1)
index = random.randint(0,11)
self.result.set(list1)
i += 1
if i >= 50:
self.isloop = False
def newtask(self):
if self.isloop == False:
self.count += 1
t = threading.Thread(target=self.randomRun)
t.start()
self.isloop = True
def endtask(self):
self.isloop = False
self.result.set("恭喜您," + str(self.count) + "次后,抽中了" + self.result.get() + "奖品!")
self.count = 0
c = choujiang()
在这个版本中,我将抽奖的逻辑进行了重新设计。在 randomRun 方法中,使用 random.randint(0,11) 函数随机生成一个整数,然后让抽奖结果显示在窗口上。在每次点击“开始”按钮后,会在开启一个新的线程来运行 randomRun 方法,直到点击“停止”按钮时结束线程,并将抽奖结果显示在窗口上。此外,我还添加了一些界面设计,可以根据需要进行修改。
希望这个版本可以解决你的问题,如果还有其他问题,欢迎继续提问哦~
歌者文明清理员 发表于 2023-4-9 09:53
在这个版本中,我将抽奖的逻辑进行了重新设计。在 randomRun 方法中,使用 random.randint(0,11) 函数随机 ...
运行结果,看不懂,{:5_107:}
C:\Users\Administrator\AppData\Local\JetBrains\PyCharm2022.1\demo\PyCharmLearningProject\venv\Scripts\python.exe C:/Users/Administrator/Desktop/BaiduSyncdisk/py/抽奖修改版2.py
Traceback (most recent call last):
File "C:\Users\Administrator\Desktop\BaiduSyncdisk\py\抽奖修改版2.py", line 57, in <module>
c = choujiang()
^^^^^^^^^^^
File "C:\Users\Administrator\Desktop\BaiduSyncdisk\py\抽奖修改版2.py", line 14, in __init__
self.setwindow()
File "C:\Users\Administrator\Desktop\BaiduSyncdisk\py\抽奖修改版2.py", line 27, in setwindow
self.label_result = tkinter.Label(self.root, textvariable=self.result, font=('Arial', 24), fg='red')
^^^^^^^^^^^
AttributeError: 'choujiang' object has no attribute 'result'
进程已结束,退出代码1
https://share.weiyun.com/Kaby7N2e Aiden_H 发表于 2023-4-9 18:09
运行结果,看不懂,
C:%users\Administrator\AppData\Local\JetBrains\PyCharm2022.1\demo\PyCha ...
看起来程序运行时出现了一个错误,提示 AttributeError: 'choujiang' object has no attribute 'result',这个错误原因可能是因为在初始化 choujiang 类时,没有正确地定义 self.result 这个实例变量。
请检查你的代码中是否存在以下几种情况:
检查代码中是否有定义 self.result 的语句,例如 self.result = tkinter.StringVar()。
检查代码中是否有使用 self.result 的地方,例如 self.result.set('开始抽奖')。
如果以上两者都没问题,可以尝试重启 PyCharm 或更换 Python 环境重新运行程序。
如果还不行,可以把你的完整代码复制到文本编辑器中,然后按照上面的步骤逐个排查错误。希望能帮助你解决问题~
另外:发图片:https://fishc.com.cn/thread-226351-1-1.html 歌者文明清理员 发表于 2023-4-9 18:54
看起来程序运行时出现了一个错误,提示 AttributeError: 'choujiang' object has no attribute 'result' ...
import tkinter
import time
import threading
import random
class choujiang:
def __init__(self):
self.root = tkinter.Tk()
self.root.title('抽奖')
self.root.minsize(300, 300)
self.isloop = False
self.newloop = False
self.setwindow()
self.result = tkinter.StringVar()
self.result.set('开始抽奖')
self.count = 0
self.root.mainloop()
def setwindow(self):
self.btnstart = tkinter.Button(self.root, text="开始", command=self.newtask)
self.btnstart.place(x=40, y=60, width=80, height=50)
self.btnend = tkinter.Button(self.root, text="停止", command=self.endtask)
self.btnend.place(x=180, y=60, width=80, height=50)
self.label_result = tkinter.Label(self.root, textvariable=self.result, font=('Arial', 24), fg='red')
self.label_result.place(x=70, y=150)
def randomRun(self):
i = 0
list1 = [" "," "," "," "," "," "," "," "," "," "," "," "]
while self.isloop == True:
if self.newloop == True:
self.isloop = False
return
time.sleep(0.1)
index = random.randint(0,11)
self.result.set(list1)
i += 1
if i >= 50:
self.isloop = False
def newtask(self):
if self.isloop == False:
self.count += 1
t = threading.Thread(target=self.randomRun)
t.start()
self.isloop = True
def endtask(self):
self.isloop = False
self.result.set("恭喜您," + str(self.count) + "次后,抽中了" + self.result.get() + "奖品!")
self.count = 0
c = choujiang()
我是复制5楼的代码直接运行的,没有修改过 歌者文明清理员 发表于 2023-4-9 18:54
看起来程序运行时出现了一个错误,提示 AttributeError: 'choujiang' object has no attribute 'result' ...
我是复制你5楼的代码,没作任何修改
import tkinter
import time
import threading
import random
class choujiang:
def __init__(self):
self.root = tkinter.Tk()
self.root.title('抽奖')
self.root.minsize(300, 300)
self.isloop = False
self.newloop = False
self.setwindow()
self.result = tkinter.StringVar()
self.result.set('开始抽奖')
self.count = 0
self.root.mainloop()
def setwindow(self):
self.btnstart = tkinter.Button(self.root, text="开始", command=self.newtask)
self.btnstart.place(x=40, y=60, width=80, height=50)
self.btnend = tkinter.Button(self.root, text="停止", command=self.endtask)
self.btnend.place(x=180, y=60, width=80, height=50)
self.label_result = tkinter.Label(self.root, textvariable=self.result, font=('Arial', 24), fg='red')
self.label_result.place(x=70, y=150)
def randomRun(self):
i = 0
list1 = [" "," "," "," "," "," "," "," "," "," "," "," "]
while self.isloop == True:
if self.newloop == True:
self.isloop = False
return
time.sleep(0.1)
index = random.randint(0,11)
self.result.set(list1)
i += 1
if i >= 50:
self.isloop = False
def newtask(self):
if self.isloop == False:
self.count += 1
t = threading.Thread(target=self.randomRun)
t.start()
self.isloop = True
def endtask(self):
self.isloop = False
self.result.set("恭喜您," + str(self.count) + "次后,抽中了" + self.result.get() + "奖品!")
self.count = 0
c = choujiang()
Aiden_H 发表于 2023-4-9 22:57
我是复制你5楼的代码,没作任何修改
这我就不知道了,init方法里有reslt的啊
页:
[1]