Processing a key pressed in Python 3.6

MRAB python at mrabarnett.plus.com
Tue Jan 23 20:00:38 EST 2018


On 2018-01-23 23:29, Virgil Stokes wrote:
> Another follow-up question:
> 
> How would this code be modified to handle using the "Esc" key instead of
> the "Enter" key?
> 
This version uses msvcrt on Windows:

import msvcrt
import threading
import time

shutdown = False

def wait_for_enter():
     global shutdown

     print("Hit Enter to quit.")
     # b'\x0D' is the bytestring produced by the Enter key.
     # b'\x1B' is the bytestring produced by the Esc key.
     if msvcrt.getch() == b'\x1B':
         shutdown = True

threading.Thread(target=wait_for_enter).start()

while "more work to do":
      print("Getting data...")
      time.sleep(1)
      print("Saving data to file...")
      time.sleep(1)

      if shutdown:
          print("Pre-termination...")
          time.sleep(1)
          raise SystemExit("exit")


Another function of note is "msvcrt.kbhit()", which will tell you if 
there's a key waiting to be read.

This is all in the docs for the msvcrt module.
> 
> On 2018-01-23 20:15, Chris Angelico wrote:
>> On Wed, Jan 24, 2018 at 5:50 AM, Virgil Stokes <vs at it.uu.se> wrote:
>>> I would appreciate help on finding a solution to following problem. This is
>>> the general structure of the "problem" code:
>>>
>>>> while True
>>>>      # Get some data from the web and process it
>>>>      ...
>>>>      ...
>>>>      # Write these data to a file
>>>>      ...
>>>>      ...
>>>>      # Check if a_key has been pressed in the command window
>>>>      ...
>>>>      ...
>>>>      if a_key_pressed:
>>>>          # Perform some pre-termination tasks
>>>>          ...
>>>>          ...
>>>>          # Close the output data file
>>>>          ...
>>>>          ...
>>>>          raise SystemExit('Exit')
>>>
>>> I am running the code with Python 3.6 on a windows 10 platform. I have tried
>>> many approaches (mainly those posted on stackoverflow) but I have yet to
>>> find an approach that works for this structure.
>>>
>>> Note:
>>>    1) The code is executed in the windows 10 command window
>>>    2) I am not using wxPython, IDLE, or pyGame in this application.
>>>    3) The time to get the data, process it and write it to a file can
>>>       take from 0.5 sec to 1.5 sec
>>>    4) The key hit need not be echoed to the command window
>>>
>> Are you okay with demanding a specific key, rather than simply "press
>> any key"? Even better, key combination? Handle Ctrl-C by catching
>> KeyboardInterrupt and you can take advantage of Python's existing
>> cross-platform handling of the standard interrupt signal.
>>
>> If Ctrl-C won't work for you, how about stipulating that it be Enter?
>> "Press Enter to quit" isn't too much worse than "Press any key to
>> quit" (plus you have less chance of accidentally terminating the
>> program when you don't want to). Spin off a thread to wait for enter.
>> I've tested this only on Linux, but it ought to work:
>>
>> import threading
>> import time
>>
>> shutdown = False
>> def wait_for_enter():
>>      print("Hit Enter to quit.")
>>      input()
>>      global shutdown; shutdown = True
>>
>> threading.Thread(target=wait_for_enter).start()
>>
>> while "more work to do":
>>      print("Getting data...")
>>      time.sleep(1)
>>      print("Saving data to file...")
>>      time.sleep(1)
>>      if shutdown:
>>          print("Pre-termination...")
>>          time.sleep(1)
>>          raise SystemExit("exit")
>>
>> If it doesn't, try switching around which is the secondary thread and
>> which is the primary - spin off a thread to do the work, then call
>> input() in the main thread.
>>
>> ChrisA
> 




More information about the Python-list mailing list