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つあり、ボタンをクリックすると、リスト「文字」(すべてプロシージャー) から値の1つがランダムに選択され、プロシージャーが実行され、追加されます。選択した値を「使用済み」リストに追加し、もう一度ボタンをクリックすると、その値が既に使用されているかどうかがチェックされ、使用されている場合は「これは既に使用されています」と表示され、使用されていない場合は実行されます。しかし、何が起こっているのかというと、同じ手順を複数回実行し、ルート ウィンドウ (ゲーム) を閉じると、ボタンを押したときに実行されたすべての手順が再実行されます。 1時間、それを理解することはできません。

4

2 に答える 2

0

問題は、ボタンを初めてクリックしたときにすべての文字がリストに追加されることです。プログラムの終了時に発生するように見えるかもしれませんが、実際には一度に発生しています。

クリックごとに Character の 1 つのインスタンスを処理する場合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 に答える
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 に答える