这是我的代码:
from Tkinter import*
from random import radint
Characters=[Percy,Annabeth,Leo,Chuck,Sarah]
Used = []
def callback():
selected = None
end = len(Characters)-1
rando = randint(0,end)
selected = Characters[rando]
for i in Characters:
if i in Used:
print 'This has already been used'
else:
Characters[rando]()
Used.append(Characters[rando])
game = Tk()
game.geometry('50x50+700+100')
Button1 = Button(game,text = '1',command =lambda:callback() )
Button1.pack(side=LEFT)
game.mainloop()
应该发生的是,程序运行,窗口中有1个按钮,单击按钮,它随机选择列表中的一个值'Characters'(所有这些都是程序),执行程序然后将所选值添加到“已使用”列表中,然后当您再次单击该按钮时,它会检查该值是否已被使用,如果已经使用,则会打印“已经使用过”,如果没有,则显示执行。 但是发生了什么,它会多次运行相同的程序,然后当我关闭根窗口(游戏)时,它重新执行我按下按钮时执行的所有程序。我一直在这一个小时,无法弄清楚。
答案 0 :(得分:0)
for i in Characters:
都会遍历列表Characters
中的所有项目。
假设您启动了应用,然后点击按钮。这就是:
for i in Characters:
i = Percy
if i in Used:
... #i is not in Used
else:
... #execute Percy() and add it to Used
i = Annabeth
if i in Used:
... #i is not in Used
else:
... #execute Annabeth() and add it to Used
...你明白了。因此,第一次运行时,所有字符都会被执行,并添加到Used
。
您应该将代码更改为以下内容:
def callback():
# code ...
rando = randint(0, end)
if Characters[rando] in Used:
print "This has already been used"
else:
Characters[rando]()
Used.append(Characters[rando])
答案 1 :(得分:0)
您的问题是,当您第一次单击该按钮时,它会将所有字符添加到列表中。它可能会在您的程序结束时发生,但它实际上是一次性发生的。
假设您希望在每次单击时处理单个Character实例,则需要添加break
语句以在将某些内容附加到列表后终止循环。
for i in Characters:
if i in Used:
print 'This has already been used'
else:
Characters[rando]()
Used.append(Characters[rando])
break