2017-09-17 13 views
0

私は、GUIプログラミングのためにappJarpython3で手作業を体験しようとしています。私は、ボタンが押されたときに行われるアクションを追加しようとしています。それは正常に動作しますが、それは不思議に終わります。appJar python:button press action

コードの一部は次のとおりです。ボタンが押されるたびに関数「pressed」が呼び出されます。それはうまく動作します。しかし、カウントが0になると、数字0は押されません(ただし、コードごとに0というラベルを "lb1"というラベルに印刷する必要があります)。 ボタンが押され、count変数が1の場合、count変数は1だけ減算されます。次に、ラベルテキストが新しいcount数で更新されます。次に、カウンタ= 0かどうかをチェックし、真の場合はコードを終了します。 新しい値でラベルを更新する前に、フォームは終了します。いくつかのトラブルシューティングでは、ラベル値が更新されるコード行は既に実行されていますが、ラベル値はフォームの終了時にのみ更新されることがわかりました。

誰もがこれにいくつかの光を当てることができますか?

from appJar import gui 
count=10 
def pressed(btnName): 
    global count 
    count-=1 
    win.setLabel("lb1","Count= "+ str(count)) 
    if count==0: 
     win.stop() 

答えて

0

あなたが見ているのは予想される動作だと思います。

カウントが0に達すると、ラベルの更新が実行されるようにキューに入れられますが、次のコード行がGUIを停止します。数ミリ秒後に発生します。したがって、GUIが更新される前に消えます。何が画面に表示されています。

ラベル更新とGUI終了の間に若干の遅延を導入したい場合は、.after()関数を使用できます。例えば

if count == 0: 
    win.after(500, win.stop) 

これは、停止機能を呼び出す前に500ミリ秒を遅らせます。あなたはGUIがCount= 0を表示し、開いたまま、そして唯一のユーザーがボタンを押すと、次の時間を閉じたい場合は


また、唯一のwin.stop()count == -1


を呼び出すためにあなたの元のコードを変更しますしたがって、完全なコードは次のようになります。

from appJar import gui 
count=10 
def pressed(btnName): 
    global count 
    count-=1 
    win.setLabel("lb1","Count= "+ str(count)) 
    if count == 0: 
     win.after(500, win.stop) 

win = gui() 
win.addLabel("lb1", "empty") 
win.addButton("PRESS", pressed) 
win.go() 
+0

ありがとうございました。私はwin.stop()の前にsleep()を使用しましたが、うまくいきませんでした。ラベルは関数出口でのみ更新されます 私はあなたのソリューションを試しました。あなたが説明したようにうまくいかなかった。 .after()を使用しましたが、どの値を使用しても、カウンタがゼロになった直後にGUIフォームが終了します。それにもかかわらず、プログラムは遅延を終了します(私はコンソールから見ることができます)が、GUIはありません。つまり、GUIフォームは直ちに終了しますが、設定された_delay_値に対してプログラムは実行を継続します。 .after()メソッドは、GUIが終了した後ではなく、前にではなく遅延を追加すると判断できます。 –

+0

'sleep()'を使うと、GUIスレッドが一時停止し、更新が行われなくなります。 'sleep()'が終了すると、GUIは直ちに終了するので、ラベルの更新は表示されません。 元の回答を更新して、コード例を掲載しました。 '.after()'はGUIのイベントループに関数呼び出しをキューイングするので、GUIは更新され、指定されたミリ秒数(この場合は500)の後にGUIが終了します。 –

+0

ありがとうございました。それが問題を解決しました。コードをもっと詳しく調べたところ、.after()メソッドを正確に使用していないことがわかりました。私は初めてwin.after(200、win.stop())を書きました。 win.after(200、win.stop) これは初めてのことです。今は正常に動作しています。ありがとうございました。 –