窗口关闭后代码重新执行

时间:2012-10-22 05:20:08

标签: python python-2.7 tkinter

这是我的代码:

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

2 个答案:

答案 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