2017-11-14 16 views
2

私はPythonにはかなり新しく、基本的なストップウォッチスクリプトを作成しようとしています。ストップウォッチを一時停止できるようにしたいが、次の数字が表示されるのを待つコードtime.sleep(1)がキーボードイベントを妨害する。 BTW私はイベントを取得するために、Pythonパッケージの 'キーボード'を使用しています。私はスレッドを試みましたが、私が知る限り他のスレッドを一時停止することはできません。スクリプト全体を一時停止することなくPythonをスリープさせるには

ここに私のコードです:

import time, keyboard, sys 

print('Stopwatch \n') 
input('Press enter to start:') 

def counter(): 
    stopwatch = 0 
    while True: 
     time.sleep(1) 
     stopwatch += 1 
     print(stopwatch) 
     question() 

def question(): 
    while True: 
     if keyboard.is_pressed('p'): 
      print('\nPaused') 
      input('Press enter to resume:') 
     if keyboard.is_pressed('s'): 
      print('\nStopped') 
      sys.exit() 

counter() 

私は必ずしもquestion機能を必要としませんが、私はそれが仕事を得ることができるかどうかを確認するために実験を行いました。私は2つの機能を組み合わせることができました。

+3

非同期プログラミングへようこそ。古い冗談は次のようなものです。「プログラマーは問題を抱えていました。「わかっていますが、私は非同期プログラミングを使用します!今は彼に2つの問題があります。 –

+1

私のコード[here](https://stackoverflow.com/a/45164619/4014959)が参考になる場合があります。 –

+0

将来の参考として、これはUnix-Linux上の 'select'呼び出しやWindows上のスレッドを使って行うことができます。詳細はこちら[こちら](https://repolinux.wordpress.com/2012/10/09/non-blocking-read-from-stdin-in-python/) –

答えて

1

私には良いニュースと悪いニュースがあります。悪いニュースは、あなたが直面している問題のために、あなたがしようとしていることをしようとしていることを、あなたがすることができないということです。 Pythonには、ある関数の実行を一時停止する方法はありません。すべて、またはまったくありません。あなたはmultiprocessingまたはthreadingを使って実装することでこれを解決できますが、実際には準備が整う前にその中に侵入するワームの缶を開いているだけです。

良いニュースは、すべてを行う必要はないということです。あなたは開始時間と終了時間の違いを見つけることを試みていますよね?それを基本に煮詰めてやろう。

import datetime 

start = datetime.datetime.now() 
input("Press enter to stop.") 
stop = datetime.datetime.now() 
result = (stop - start).total_seconds() 

あなたは開始と停止、実行中の合計に追加する間の秒の違いを取得し、(あなたが上やったようwhile Trueループで)他のアクションを待っていることにより、一時停止実装することができます。

+0

この方法では秒を表示することはできますか? –

+0

いいえ、そうではありませんが、その機能が必要な場合を除き、非同期を導入する価値のあるものではありません。 –

+0

時間がかかっていなければ、ストップウォッチプログラム自体は比較的簡単で、私はいくつかの非同期のものに自分自身を紹介したいと考えていました。それは実際のコードが動作しているのではなく、Pythonのプロセスを学ぶことに関するものです。参考資料にリンクしていただければ、それは大変ありがたいです。 –

関連する問題