11

ここに私の目標があります: 挨拶で始まる小さなプログラム (テキストベース) を作成するには、最後のイベントからの経過時間のタイマーを出力し、次にイベントのタイマーを出力します。私はこのコードを使用してタイマーを見つけようとしましたが、私の最初の問題は、タイマーが新しい秒ごとに新しい行で繰り返し続けることです。どうすればそれを止めることができますか?また、このタイマーは時計の実際の秒数よりも遅れているようです。

import os
import time


s=0
m=0

while s<=60:
    os.system('cls')
    print (m, 'Minutes', s, 'Seconds')
    time.sleep(1)
    s+=1
    if s==60:
        m+=1
        s=0
4

12 に答える 12

12

私は次のようなものに行きます:

import time
import sys

time_start = time.time()
seconds = 0
minutes = 0

while True:
    try:
        sys.stdout.write("\r{minutes} Minutes {seconds} Seconds".format(minutes=minutes, seconds=seconds))
        sys.stdout.flush()
        time.sleep(1)
        seconds = int(time.time() - time_start) - minutes * 60
        if seconds >= 60:
            minutes += 1
            seconds = 0
    except KeyboardInterrupt, e:
        break

ここでは、スリープが正確に 1 秒ではないため、単なるスリープ インクリメンタではなく、実際の時間モジュールに依存しています。

また、おそらくprintの代わりに使用できsys.stdout.writeますが、ほぼ確実に still が必要になりsys.stdout.flushます。

お気に入り:

print ("\r{minutes} Minutes {seconds} Seconds".format(minutes=minutes, seconds=seconds)),

新しい行が印刷されないように、末尾のコンマに注意してください。

于 2013-04-04T05:08:19.887 に答える
0

私の PC (Windows 7) では、cmdウィンドウで実行すると、このプログラムはほぼ正確に機能します。タイマーが毎秒新しい行で繰り返されている場合、それはあなたにとってはうまくいかないことを示唆していos.system ('cls')ます.Windows以外のOSで実行しているためでしょうか?

このテストでは が 60 になることは決してないため、このステートメントwhile s<=60:は正しくないように見えますs。60 になると常に 0 にリセットされ、mインクリメントされます。おそらくテストはwhile m<60:

最後に、私の PC では、タイマーが時計の実際の秒数より遅れているようには見えません。while必然的に、このコードはクロック上で数秒遅れます。つまり、を除いてループ内のすべてのコード行を実行するのにかかる時間にtime.sleep(1)加えて、プロセスがスリープ状態から復帰する際の遅延です。私の場合、それはまったく長くはありませんが、そのコードの実行に (何らかの理由で) 0.1 秒かかった場合 (たとえば)、タイマーは実時間と比較して 10% 遅く実行されます。@sberry の回答は、この問題に対処する 1 つの方法を提供します。

于 2013-04-04T05:11:55.723 に答える
0

わかりました、タイマーが遅れている理由から始めましょう。

プログラムで何が起こるかというと、time.sleep()呼び出しがプログラムの操作を 1 秒間「スリープ」させ、その秒が経過すると、プログラムは再び実行を開始します。1s + Xsしかし、プログラムは、実行するように指示した他のすべてのコマンドを実行する時間が必要なため、実際にすべての操作を実行するには時間がかかります。これは非常に基本的な説明ですが、タイマーが同期しない根本的な理由です。

常に新しい行に出力している理由については、print()関数には、指定された文字列に追加する定義済みの行末文字があります。

print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False)

end="YourThing"次のようにprintステートメントを入れることで、これを何かで上書きできます

for x in range(3):
    print("Test", end="")

上記の例では、空の文字列が行末に追加されるため、ループの出力は次のようになります。

"TestTestTest"

タイマーの問題を解決するには、次のようなものを使用する必要があります

timePoint = time.time()

while True:

    #Convert time in seconds to a gmtime struct
    currentTime = time.gmtime(time.time() - timePoint))

    #Convert the gmtime struct to a string
    timeStr = time.strftime("%M minutes, %S seconds", currentTime)

    #Print the time string
    print(timeStr, end="")
于 2013-04-04T05:14:46.590 に答える