2017-08-12 4 views
2

私がどれくらいの間私の息を止めることができるかを考えたいと思います。私はPythonでそれをしたいと思います。私は短いスクリプトを持っている:スペースバーでタイマーを中断する

start = time() 
try: 
    while True: pass 
except KeyboardInterrupt: 
    print(time() - start) 

これは私がしたい基本的な機能を持っていますが、それは、致命的な欠点を持っています。長い間、私の息を抱きしめた後、私の心はあまりにも曖昧であるかもしれませんし、すぐにCtrl + cを押すというコーディネーションが見つからないかもしれないので、私のトレーニングに関する重要なデータが失われるかもしれません。

スペースバーのほうがはるかに簡単です。私はそれを押すとループを止める簡単な方法はありますか?

編集:私はあなたがrawモードにコンソールのキーボード(PTY)ドライバを配置する必要がありOSX

+2

Lol ...真剣に?ちょうどストップウォッチを使用してください。 –

+0

致命的な欠点....おそらく、あなたは死に至る前に脱走するでしょう。あなたは水の下でそれをやっている場合にのみ、致命的な欠点があります。 – Fallenreaper

+0

@cᴏʟᴅsserious真剣ではありませんが、私は本当にctrlよりもむしろスペースバーでループを中断できるようにしたいです。 –

答えて

1

上です。それは、この回答で説明されて :What is the easiest way to detect key presses in python 3 on a linux machine?

その答えから自由に引用:

#! /usr/bin/env python3 
import sys 
import termios 
import time 
import tty 


def hold_breath(fin): 
    orig_setting = termios.tcgetattr(fin) 
    tty.setraw(fin) 
    start = time.time() 
    try: 
     ch = fin.read(1)[0] 
     assert ch == ' ' 
    finally: 
     print('You lasted %.03f seconds.\r' % (time.time() - start)) 
     termios.tcsetattr(fin, termios.TCSADRAIN, orig_setting) 


if __name__ == '__main__': 
    print('Hit space.') 
    hold_breath(sys.stdin) 

作品罰金をOS/XおよびLinux上で。プログラムを中断して元の設定に戻す場合は、$ stty saneがあなたの友人です。

+0

これは有望ですが、SE上ではリンクのみの回答を受け入れるべきではありません。 –

+0

フィンは何を意味し、なぜhold_breathを定義するときに必要なときにsys.stdinを使うのはなぜですか? –

+0

また、このソリューションでは、キーが押されるまでsys.stdin.read(1)がフリーズするため、ループ内に何も置くことはできません。私はタイマーを表示することはできません、と言う。 –

0
import sys                   
import termios                  
import contextlib                 

SPACE_BAR = 32                  

@contextlib.contextmanager              
def raw_mode(file):                 
    old_attrs = termios.tcgetattr(file.fileno())          
    new_attrs = old_attrs[:]               
    new_attrs[3] = new_attrs[3] & ~(termios.ECHO | termios.ICANON)     
    try:                    
     termios.tcsetattr(file.fileno(), termios.TCSADRAIN, new_attrs)    
     yield                  
    finally:                   
     termios.tcsetattr(file.fileno(), termios.TCSADRAIN, old_attrs)    


def main():                   
    print 'exit with spacebar'              
    with raw_mode(sys.stdin):              
     try:                   
      while True:               
       if sys.stdin.read(1) == chr(SPACE_BAR):       
        break               

     except (KeyboardInterrupt, EOFError):          
      pass                 


if __name__ == '__main__':              
    main()     
+0

を参照してください。より良い方法を! –

1

回答はお使いのOSによって異なります。 Windowsでは、これはキーを押すたびに停止しますが、返り値msvcrt.getch()を調べてスペースかどうかを判断できます。あなたが外に出て、あなたの顔がキーボードに当たると、それはどんなキーでも止まります。

import time 
import msvcrt 
start = time.time() 
while not msvcrt.kbhit(): # Indicates a key is waiting to be read 
    pass 
end = time.time() 
msvcrt.getch() # read and (in this case) throw away the key press. 
print(end-start) 
+0

これはまさに私が欲しいものに似ています...あまりにも悪い私はMacOSにいる。私は事前に指定しておくべきです。 –

関連する問題