2016-12-13 124 views
0

私は割り当てのためのシンプルなスロットマシンのPythonプログラムを作ろうとしており、スロットマシンのイメージを更新するのに問題があります。私がしたいのは、ユーザーがボタンをクリックして、3秒間0.1秒ごとに異なる画像で2つのラベルを動的に更新させることです。しかし、何が起きているのですか?randintは配列のインデックス番号をランダムに生成していますが、ラベルは最後のrandintインスタンスにのみ新しいイメージを表示します。tkinterラベルウィジェットの画像を動的に更新するには?

def update_image(): 
     global images 
     time.sleep(0.1) 
     y = images[randint(0, 3)] 
     slot1.delete() 
     slot1.configure(image = y) 
     print(y) 

def slot_machine(): 
     x = 0 
     while x != 10: 
       slot1.after(0,update_image) 
       x = x + 1 
+0

は、なぜあなたはslot1.after 'を呼び出す(0、...)'、その後されていますすぐに 'update_image'で10分の1秒寝ていますか?なぜ 'slot1.after(100、...)'を呼び出さないのでしょうか?一般的なルールとして、メインのGUIスレッドでは 'sleep'を決して呼び出さないでください。 –

答えて

0

問題はあなたができるだけ早く実行されるように、「後」キューにジョブを追加after(0, ...)を呼び出しているということです。ここで私が持っているコードです。ただし、whileループは非常に迅速に実行され、イベントループにはキューに入れられたイベントを処理する機会が与えられないので、ループ全体が終了して単一のイメージが変更されます。

イベントループがイベントを処理できるようになると、tkinterは延期されているすべての保留イベントを処理しようとします。タイムアウトをゼロにしていたので、それらはすべて期日を過ぎてしまい、tkinterはできるだけ早くすべてを実行します。

よりよい解決策は、画像を更新する機能を持っていて、次の更新をスケジュールする役割も担うことです。例えば:それと

def update_image(delay, count): 
    <your existing code here> 

    # schedule the next iteration, until the counter drops to zero 
    if count > 0: 
     slot1.after(delay, update_image, delay, count-1) 

、あなたは一度それを呼び出すと、それはそれ以降、繰り返し自分自身を呼び出します。

update_image(100, 10) 
+0

それは素晴らしいです!ありがとうございました! – MustardFacial

関連する問題