Python input single character without enter
Solution 1
You can define your own version of getch
using the termios
, sys
and tty
packages:
def getch():
import termios
import sys, tty
def _getch():
fd = sys.stdin.fileno()
old_settings = termios.tcgetattr(fd)
try:
tty.setraw(fd)
ch = sys.stdin.read(1)
finally:
termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
return ch
return _getch()
Solution 2
This is a tested (on RPi, Py 3) code that can read a specified length of chars without need to hit Enter button
But consider one thing :
This must run on terminal otherwise raises an error
import termios, sys , tty
def _getch():
fd = sys.stdin.fileno()
old_settings = termios.tcgetattr(fd)
try:
tty.setraw(fd)
ch = sys.stdin.read(1) #This number represents the length
finally:
termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
return ch
getch = _getch()
print(getch)
Related videos on Youtube
ArgoLake
Updated on September 15, 2022Comments
-
ArgoLake over 1 year
What I am trying to do is make a simple pi memorization game in Python. What I need is a way to get input from the user without having to press 'enter' after every character. It sounds like I need something like getch, but I can't get it to work. I got a getch-like function from here: https://gist.github.com/chao787/2652257#file-getch-py. I don't really understand anything that's in there. When I do '
x = getch.getch()
' it says "AttributeError: '_Getch' object has no attribute 'getch'
". It looks like msvcrt can do it for Windows, but I have a Mac. It also looks like curses is a thing that has getch, but it says I need to do initscr first, but then I get the error "File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/curses/__init__.py", line 30, in initscr fd=_sys.__stdout__.fileno()) _curses.error: setupterm: could not find terminal
".This is my file just using input, where you would have to press enter every time (I actually put in 1000 digits, not an ellipsis).
pi = '3.1415926535...' def main(): print('Welcome to PiGame!') pigame() while True: yn = input('Play again? y/n ') if yn == 'y': pigame() else: return def pigame(): n=0 print('Go!') while n<=1000: x = input() if x == pi[n]: n += 1 else: print('I\'m sorry. The next digit was '+pi[n]+'.') print('You got to '+str(n)+' digits!') return print('You got to 1000! Hooray!')
-
Alex Martelli over 9 years
-
-
deathangel908 over 8 yearstermios.error: (25, 'Inappropriate ioctl for device')
-
Yoni Baciu over 7 yearsneeds to be return _getch() in the end (you forgot parenthesis)
-
user1067305 over 5 yearsApparently termios does not exist on Windows system. Is there any way to adapt Term::ReadKey from perl which does work on Windows?