2012-10-22 71 views
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個按鈕在窗口中,點擊該按鈕,就隨機選擇的一個來自'Characters'列表中的值(所有這些都是過程),執行該過程,然後將選定的值添加到'Used'列表中,然後再次單擊該按鈕時,它會檢查該值是否已被使用,以及如果有,它會打印'這已經被使用',如果沒有,它會執行。但是,發生的事情是,它會多次運行相同的過程,然後當我關閉根窗口(遊戲)時,它會重新執行我按下按鈕時執行的所有過程。我一直在這一個小時,並無法弄清楚。

+1

'random.choice()' –

回答

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

這是確切的代碼之前,我有'for'循環,但它會運行同樣的程序多次我了。 –

+0

@ChuckFulminata:你是說它會多次選擇同一個角色?例如,它運行'Percy()',然後嘗試再次運行Percy(當然,因爲它已經被使用了)? –

0

你的問題是你第一次點擊該按鈕,將所有的字符添加到列表中。它可能看起來是在程序結束時發生的,但它實際上是一次發生的。

假設您想要在每次單擊時處理單個字符實例,則需要添加一條break語句以在將某些內容附加到列表後添加終止循環。

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