2017-08-12 1 views
2

Sagen, ich möchte Zeit, wie lange ich den Atem anhalten kann, und ich möchte das mit Python tun. Ich habe kurzes Skript:Unterbrechen eines Timers mit der Leertaste

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

Dies hat die grundlegende Funktionalität ich will, aber es hat einen fatalen Mangel. Nach einer langen Zeit, in der ich den Atem angehalten habe, ist mein Geist vielleicht etwas verschwommen und ich finde vielleicht nicht die Koordination, um sofort Strg + c zu drücken, und ich könnte wichtige Daten über mein Training verlieren.

Die Leertaste ist viel einfacher Ziel zu treffen. Gibt es eine einfache Möglichkeit, die Schleife anzuhalten, wenn ich sie drücke?

EDIT: Ich bin auf OSX

+2

Lol ... ernst? Verwenden Sie einfach eine Stoppuhr. –

+0

fatalen Mangel .... Unwahrscheinlich, Sie werden vor dem Sterben ohnmächtig werden. Sie haben nur dann ein fatales Manko, wenn Sie es unter Wasser tun. – Fallenreaper

+0

@ cᴏʟᴅsᴘᴇᴇᴅ nicht ernsthaft, aber ich würde wirklich gerne in der Lage sein, eine Schleife mit Leertaste statt Ctrl c –

Antwort

1

Sie müssen die Konsole Tastatur (pty) Treiber in Raw-Modus setzen. Es ist in dieser Antwort erklärt: What is the easiest way to detect key presses in python 3 on a linux machine?

frei aus dieser Antwort Zitiert:

#! /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) 

funktioniert auf OS/X und Linux. Wenn Sie das Programm unterbrechen, bevor es die ursprüngliche Einstellung wiederherstellt, ist $ stty sane Ihr Freund.

+0

zu unterbrechen Dies sieht vielversprechend aus, aber Link nur Antworten sollten nicht auf SE akzeptiert werden. –

+0

Wofür steht fin, und warum sollte ich nicht einfach sys.stdin verwenden, wenn es bei der Definition von hold_breath benötigt wird? –

+0

Auch diese Lösung erlaubt mir nichts in der Schleife, wie sys.stdin.read (1) einfriert, bis eine Taste gedrückt wird. Ich kann keinen Timer anzeigen, sagen wir. –

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

Ich nehme dein Wort dafür aber ... ES MUSS SEIEN SIE BESSER! –

1

Die Antwort hängt von Ihrem Betriebssystem ab. Unter Windows wird dies bei jedem Tastendruck angehalten. Sie können jedoch den Rückgabewert msvcrt.getch() betrachten, um festzustellen, ob es sich um Speicherplatz handelt. Wenn Sie jetzt ohnmächtig werden und Ihr Gesicht die Tastatur berührt, wird es auf jeder Taste stehen bleiben.

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

Das sieht genau so aus, wie ich es will ... schade, ich bin auf MacOS. Ich hätte es im Voraus spezifizieren sollen. –

Verwandte Themen