2017-05-09 12 views
0

私は多少の量を入力する小さなゲームに取り組んでいます。 3秒後に、カラーフレームの順序を呼び出すように促すプロンプトが表示されます。Pythonパックは、メソッドが完了した後にのみ有効になります。

カウントダウン後のイベントはまだ実装されていません(問題はありません)。

私は、入力フィールドと、確認ボタンを非表示にする方法を持っている色が表示され、カウントダウンん:

def startgame(colornumber): #colornumber is the amount of frames 
    ... 
    colors=[] #array of "Frame" elements 
    #loop that creates the colored frames 
    for i in range (0, colornumber): 
     colors.append(Frame(window, width=60, height=60, background=randomcolor())) 
     colors[i].pack(side=LEFT) 

    #randomcolor() is a method that returns a random color string 
    #like "white" or "red" 

    #countdown loop 
    for i in range(0, 3): 
     time.sleep(1) #do nothing for 1 second 
     label.configure(text="ASD") #Count down 
     print(str(3-i)) 
    label.configure(text="What was the order? Click on the colors to choose") 

ボタンはそうのような関数を呼び出すための:

colorNumberInput = Entry(window) 
colorNumberInput.pack() 
buttonConfirmNumber = Button(window, ..., command=lambda: startgame(int(colornumberInput.get())) 
buttonConfirmNumber.pack() 

を何らかの理由で、color[i].pack(side=LEFT)ステートメントの効果は、メソッドの実行が終了した後にのみ発生します。つまり、カウントダウンループが終了した後です。その結果、カウントダウンの後ではなく、カウントダウン後にカラーが表示されます。私はprintステートメントをカラーフレームを作成するループに入れてみましたが、とにかく実行します。

なぜpack(element)は、呼び出されたメソッドが終了した後にのみウィジェットを表示しますか?この問題を回避できる方法はありますか?

答えて

0

Tkinterは、イベントに応答してディスプレイをリフレッシュすることしかできません。コードが実行されている間、またはプログラムがスリープしている間、イベントに応答することはできません。

すぐに画面を更新したいときはいつでもwindow.update_idletasks()に電話することです。これは通常、最良の解決策ではありませんが、それはしばしば十分です。

+0

"十分に良い"場合もありますが、 'time.sleep' +' tkinter'はほとんど常にひどいです。全く応答しないGUIで3秒を費やすことは、非常にユーザーに敵対しています。 – ShadowRanger

+0

@ ShadowRanger:引数がありません。 –

関連する問題