I am running a process in a command window (Windows 7, Python 3.1) where I would like the user to abort the process by pressing the ESCape key. However, pressing the ESCape key doesn't appear to do anything :-(, the loop never breaks. I have also tried running the script from within my IDE (Wing), but again, the loop cannot be interrupted.
The following is a stripped-down version of my proof-of-concept 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 anyone could tell me where I might be going wrong I would be most grateful.
Have you tried using a different key to test if it's not just that key?
Did you also try the examples at (http://effbot.org/librarybook/msvcrt.htm) to see if they worked?
Python 2/3 compatible code:
Code parts are taken from
pager
module with more stuff inside.You don't need encode, decode, chr, ord, ....
or if you'd like to see "27" in the code somewhere:
You should really strip down more, like this one below:
So here is the problem:
msvcrt.getch()
returnsbytes
,chr(27)
returnsstring
. In Python 3 they are two distinct types, so the "==
" part will never work, and theif
statement will always be evaluated asFalse
.The solution should be obvious to you.
More about strings vs bytes, from the book Dive into Python 3.
The interactive console is very useful for debugging, try use it more :)
Python 3 strings are unicode and, therefore, must be encoded to bytes for comparison. Try this test:
Or this test:
Or this test: