[Tutor] A little help please

alan.gauld@bt.com alan.gauld@bt.com
Wed, 26 Dec 2001 16:27:06 -0000

> I'm in need of a function that will work on both a linux box and a 
> windows box that, from the command line, will detect a key hit 
> on the keyboard.  

There is no portable way of doing this(*) in standard Python but
you can do it by using two distinct modules:

msvcrt for Windows and curses for Linux

They both have similar getch() functions and you could test 
for the OS at the top of the function. Something like:

def getkey():
   if os == windows or NT or DOS:
      return msvcrt.getch()
   elif os == posix:
      return curses.wgetch()
   else: return raw_input()  # don't know how to read instant keys...

I suspect you will need to write an init function for the 
curses stuff to set up the virtual screen that cureses uses.

Note that the functions will wait for input (ie not like 
BASIC INKEY$) but do not wait for an ENTER key.

> -1 for no key hit detected and the ascii code for any other 
> key hit.  

To get the -1 for no key hit you will need to do something 
clever to arrange a timeout.... Maybe launching a thread 
then killing it after a delay, thats getting trickier...

> of this function would be function keys.  

The msvcrt.getch works with function keys etc, I don't 
remember how curses.wgetch works.

You might like to take a peek at my online tutor under 
Event Driven programming to see an example, if you can 
find a copy of my book even better since it shows 
msvcrt.getch in action.


Alan G.

(*) Fred Lundh has a console module that tries to be OS 
independant but I can't recall if it has a getch function.