How to detect ESCape keystroke in Python?

I start the process in a command window (Windows 7, Python 3.1), where I would like the user to interrupt the process by pressing the ESCape key. However, pressing the ESCape key does not look like anything: - (, the loop never breaks. I also tried to run the script from my IDE (Wing), but again, the loop could not be interrupted.

Below is a stripped-down version of my authentication test ...

import msvcrt import time aborted = False for time_remaining in range(10,0,-1): # First of all, check if ESCape was pressed if msvcrt.kbhit() and msvcrt.getch()==chr(27): aborted = True break print(str(time_remaining)) # so I can see loop is working time.sleep(1) # delay for 1 second #endfor timing loop if aborted: print("Program was aborted") else: print("Program was not aborted") time.sleep(5) # to see result in command window before it disappears! 

If someone could tell me where I could be wrong, I would be very grateful.

+4
source share
5 answers

Python 3 strings are unicode and therefore must be encoded in bytes for comparison. Try this test:

 if msvcrt.kbhit() and msvcrt.getch() == chr(27).encode(): aborted = True break 

Or this test:

 if msvcrt.kbhit() and msvcrt.getch().decode() == chr(27): aborted = True break 

Or this test:

 if msvcrt.kbhit() and ord(msvcrt.getch()) == 27: aborted = True break 
+5
source

You should swap more as shown below:

 >>> import msvcrt >>> ch = msvcrt.getch() # Press esc >>> ch b'\x1b' >>> chr(27) '\x1b' >>> ch == chr(27) False 

So here is the problem: msvcrt.getch() returns bytes , chr(27) returns string . In Python 3, they are two different types, so the " == " part will never work, and the if will always evaluate to False .

The solution should be obvious to you.

More on strings and bytes from Dive to Python 3.

The interactive console is very useful for debugging, try using it more :)

+4
source

You do not need to encode, decode, chr, ord, ....

 if msvcrt.kbhit() and msvcrt.getch() == b'\x1b': 

or if you want to see "27" in the code somewhere:

 if msvcrt.kbhit() and msvcrt.getch()[0] == 27: 
+3
source

Python 2/3 compatible code:

 import time, sys ESC = '\x1b' PY3K = sys.version_info >= (3,) if PY3K: from msvcrt import kbhit, getwch as _getch else: from msvcrt import kbhit, getch as _getch while not kbhit() or _getch() != ESC: print(time.asctime()) time.sleep(1) 

Code parts are taken from the pager module with a large number of materials inside.

+2
source

Have you tried using a different key to check if this key is not the only one?

You also tried the examples at ( http://effbot.org/librarybook/msvcrt.htm ) to see if they worked?

+1
source

Source: https://habr.com/ru/post/1341570/


All Articles