私はpythonが初めてで、pygameを試しています。True にしたい変数があり、1 秒待ってから False にします。time.sleep() コマンドを見たことがありますが、他のことをしながらこれを遅らせたいだけの場合、プログラム全体を遅らせます。誰もこれを行う方法を知っていますか?
2 に答える
from time import sleep, time
started = time() # Current time saved, say 13:00
sleep(60) # <- This will freeze stuff
ended = time() # Ended at 13:01
print(started-ended,'seconds were slept')
上記の例は、特定の期間をチェックするために time() を利用する方法を示しています。次のように、開始時間がループの外にある限り、同じ方法をループで使用して時間を測定できます。
解決:
from time import sleep, time
last_time = time()
while 1:
if time()-last_time > 1:
print('One second has passed')
last_time = time()
else:
## The print() and sleep() is just here for debug purposes
## And in a graphical application you can remove the two below.
print('Still waiting for one second to pass')
sleep(0.25)
なぜこれが解決策なのですか?
まず第一に、私はコードを混乱させるために時間を無駄にすることなく、できるだけ低いレベルで物事を制御するのが好きです (Python では、「できるだけ低い」は必ずしも低いレベルではありませんが、機能の特定の側面を制御することができます事前にパッケージ化されたモジュールを使用しない)。
Python のほとんどすべてのグラフィカル モジュール (Pygame、Pyglet、Panda など) には内部タイマーがあり、通常はレンダリング プロセスのタイミングと相関しています。
今ではそれらは基本的なものに適していますが、同意する必要がありますが、複数のことを同時に実行したり、グラフィカルライブラリの外部でタイミングループを使用したりするとすぐに、ネイティブを使用したループでシンプルかつクリーンに保つ方がよいでしょうtime()
..特にマイクロ秒まで下げたい場合 (ハードウェアと OS の実装によるエラーはカウントされません)、組み込みのタイマーをテーブルから遠ざける必要もあります。
第 3 に、モジュールにすべてを依存するのではなく、実際のプログラミングを行うのに役立ちます。遅かれ早かれ、プログラマーの精神をテストにかけることになり、タイマーループや方程式のセットアップなどの小さなことでさえ役立つからです。長期的に問題を解決します。
最良の方法は、Python のスレッド機能を使用することです。これにより、プログラムの残りの部分は遅延なく実行されますが、2 秒後に func が自動的に呼び出されます。
import threading
def func():
print("2 seconds finished")
timer = threading.Timer(2.0, func)
timer.start()
また、発生する前にタスクを停止したい場合は、timer.cancel() を使用できます。