【问题标题】:Code re-executes after window closes窗口关闭后代码重新执行
【发布时间】:2012-10-22 05:20:08
【问题描述】:

这是我的代码:

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

【问题讨论】:

    标签: python python-2.7 tkinter


    【解决方案1】:

    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]) 
    

    【讨论】:

    • 这是我在 for 循环之前的确切代码,但它会多次运行相同的过程。
    • @ChuckFulminata :你是说它会多次选择同一个字符?例如,它运行Percy(),然后尝试再次运行 Percy(当然失败了,因为它已经被使用过)?
    【解决方案2】:

    您的问题是,第一次单击按钮时,它会将所有字符添加到列表中。它可能会在您的程序结束时发生,但实际上它是同时发生的。

    假设您想在每次点击时处理一个 Character 实例,您需要添加一个 break 语句以在将某些内容附加到列表后终止您的循环。

    for i in Characters:
        if i in Used:
            print 'This has already been used'
        else:
            Characters[rando]()
            Used.append(Characters[rando])
            break
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-24
      • 2016-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多