0

这是我的代码:

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个按钮,您单击该按钮,它从“字符”列表中随机选择一个值(所有这些都是程序),执行程序然后添加将选定的值添加到“已使用”列表中,然后当您再次单击该按钮时,它会检查该值是否已被使用,如果已使用,则打印“已使用”,如果没有,则执行。但是发生了什么,它会多次运行相同的程序,然后当我关闭根窗口(游戏)时,它会重新执行我点击按钮时执行的所有程序。我一直在做这个一个小时,无法弄清楚。

4

2 回答 2

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]) 
于 2012-10-22T06:26:22.423 回答
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
于 2012-10-22T11:26:11.463 回答