Python cross-platform listening for keypresses?
Solution 1:
I don't know of any cross-platform lightweight module that listens for keypresses. But here's a suggestion in case you want to implement something simple:
Check out this question on getting a single keypress at a time in the Python FAQ. You could experiment a bit with blocking reads from sys.stdin
and threading
. But this may only work on Unix. On Windows, you can use msvcrt.kbhit
.
Combining the keypress recipe from the Python FAQ and the msvcrt
module, the resulting kbhit
function would go like this:
try:
from msvcrt import kbhit
except ImportError:
import termios, fcntl, sys, os
def kbhit():
fd = sys.stdin.fileno()
oldterm = termios.tcgetattr(fd)
newattr = termios.tcgetattr(fd)
newattr[3] = newattr[3] & ~termios.ICANON & ~termios.ECHO
termios.tcsetattr(fd, termios.TCSANOW, newattr)
oldflags = fcntl.fcntl(fd, fcntl.F_GETFL)
fcntl.fcntl(fd, fcntl.F_SETFL, oldflags | os.O_NONBLOCK)
try:
while True:
try:
c = sys.stdin.read(1)
return True
except IOError:
return False
finally:
termios.tcsetattr(fd, termios.TCSAFLUSH, oldterm)
fcntl.fcntl(fd, fcntl.F_SETFL, oldflags)
Solution 2:
Short answer: no Keypresses are system-dependent. They are interrupt-driven. They one of the basic things built into most modern OSes. They have different philosophies that can't be unified in a generic way without losing functionality.
you might try- termios = unix, posix-style file-descriptor driven
curses = portal terminal-style handling (which is a specific console-based paradigm not generic)
Python wraps certain classes of input that might come from the keyboard: e.g., sys.stdin for console inupt.
But trying to get universal keyboard input is a very general problem that's inherently platform-dependent.