Check for keystroke

B

Brian

Inside a loop, I need to passively check to see if a key is pressed or not
without pausing like raw_input does. Some pseudocode:

While true:
If a key is pressed
which key is pressed

do other stuff inside loop


Google groups turned up this thread:

http://groups.google.com/groups?hl=en&lr=&ie=UTF-8&safe=off&th=
3221aa1ee6ef2ec2&seekm=2259b0e2.0307310800.3310ec83%
40posting.google.com&frame=off

TinyURL: http://tinyurl.com/4chqh


But neither the pygame or curses solution worked. Any new thoughts on
this?
 
J

Josef Meile

Hi Brian,

I saw an example on pyserial called "miniterm.py". It was about doing a
text based chat between two computers connected with through the serial
port. It is made with threads, so you can do something else while it
waits for characters from the keyboard. When a key is pressed, then it
is echoed to the console. I think you can easilly remove the serial
stuff and do the check you need. Here is the link:

http://cvs.sourceforge.net/viewcvs.py/pyserial/pyserial/examples/miniterm.py

Regards,
Josef
 
L

Lee Phillips

Inside a loop, I need to passively check to see if a key is pressed or not
without pausing like raw_input does.

I've had partial success on Mac OS X using termios (partial because
it seems to miss some keystrokes - also I haven't looked at this in
a while):

import termios
# in your method:
old = termios.tcgetattr(fd) # Old term info for restoration later
new = termios.tcgetattr(fd)
new[3] = new[3] & ~termios.ICANON & ~termios.ECHO
new[6][termios.VMIN] = 1
new[6][termios.VTIME] = 0
termios.tcsetattr(fd, termios.TCSANOW, new)

while 1:
try:
command = os.read(fd, 1)
print command+">", #Echo manually
if command == '0':
termios.tcsetattr(fd, termios.TCSADRAIN, old) #Terminal back to line mode
break
elif command == 'b':
# do something....
# and so on.....
finally:
termios.tcsetattr(fd, termios.TCSAFLUSH, old)
 
B

Brian

It took a little bit of coaxing, but I finally got it to run.
Unfortunately, it still pauses while waiting for a keystroke. Am I
missing something?

Fixed code:
import termios, sys, os
fd = sys.stdin.fileno()
old = termios.tcgetattr(fd) # Old term info for restoration later
new = termios.tcgetattr(fd)
new[3] = new[3] & ~termios.ICANON & ~termios.ECHO
new[6][termios.VMIN] = 1
new[6][termios.VTIME] = 0
termios.tcsetattr(fd, termios.TCSANOW, new)

while 1:
try:
command = os.read(fd, 1)
print command+">", #Echo manually
if command == 'p':
termios.tcsetattr(fd, termios.TCSADRAIN, old)
#Terminal back to line mode
break
finally:
termios.tcsetattr(fd, termios.TCSAFLUSH, old)
 
L

Lee Phillips

It took a little bit of coaxing, but I finally got it to run.
Unfortunately, it still pauses while waiting for a keystroke. Am I
missing something?

No, I am - I didn't pay enough attention to what you said you wanted.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
474,208
Messages
2,571,082
Members
47,683
Latest member
AustinFairchild

Latest Threads

Top