2017-02-20 8 views
0

私はボタンをクリックすると、連続してオブジェクトをtkinterウィンドウ全体に移動するcontMove()という関数があります。ただし、この関数を複数回実行するボタンをクリックすると、最初のサブルーチンが閉じられないため、スピードアップします。なぜなら、連続して実行する必要があり、動きのスピードを上げるためです。速度を上げたくないので、XまたはYの座標が変更されているかどうかをテストするチェックを入れたいと思っています。サブルーチン。これは普通のことだと思うが、私が時間モジュールについて知ることのできるものは、日付と時刻のどちらかであるか、time.sleepを使用しているが、動きを止められないので使えない。申し訳ありませんが、私はここにHow say say x> x + yの後にz秒:?

def contMove(moving): 
    global a 
    global b 
    global X, Y 
    if moving: 
     a = a + X 
     b = b + Y 
     mover.place(x = a, y = b) 
     a, b, X, Y = edgeBounce(a, b, X, Y) 
     mover.place(x = a, y = b) 
     #would be here 
     mover.after(17, lambda: contMove(moving)) 
    else: 
     return 
+0

変更 'へのお電話はafter'はこのように見て、かどうかを確認するためにそれは助けます: 'mover.after(17、contMove、動く)'。 –

+0

私は混乱しています、あなたはそれを置くことができますか?私は実際にあなたが何を意味するのか分かりません。 – Feesih0ps

+0

'mover.after(17、lambda:contMove(moving))'を削除し、 'mover.after(17、contMove、moving)'と置き換えます。 –

答えて

0

をそれを置くとき、私は私のコードの書式設定を台無し場合は、あなたがafterを使用している方法を変更する必要があります。 afterコマンドは、実際にコマンドを実行しているときに、afterコマンドが実際にコマンドを実行した場合にのみ、movingの値を検索します。したがって、afterに電話をかけてからafterが呼び出されるまでの間に値が変更されると、最新のバージョンが取得されます。

代わりに、数値をafterにすぐに渡して、機能を実行するときに値を参照する必要はありません。幸いにもafterは、関数に渡される位置引数を提供することができます。

削除し、この行のコードを修正するには、次の

mover.after(17, lambda: contMove(moving)) 

を...と、この行で置き換えます

mover.after(17, contMove, moving) 
+0

私が言ったことは何も変わっていません。最後に、私のサブルーチンの始めに.after_cancelを使う必要があることが分かりました。 – Feesih0ps

関連する問題