raw_input and break

input/ldompeling at casema.nl input/ldompeling at casema.nl
Thu Nov 5 07:59:40 EST 2015


In reply to "Peter Otten" who wrote the following:

> input/ldompeling at casema.nl wrote:
> 
> > >   choices = raw_input("letter s to stop:")
> > 
> > Oh no, this is not what I want. Now it is waiting for input when its go
> > further with the script. Because I have an while True: so I want that the
> > script go's continue only when I press a key then it must stop the script.
> 
> Solutions to that problem are OS-dependent. For Unix terminals
> 
> https://docs.python.org/2/faq/
> library.html#how-do-i-get-a-single-keypress-at-a-time
> 
> shows one way which I used to write the contextmanager below:
> 
> $ cat capture_key.py
> import termios, fcntl, sys, os
> 
> from contextlib import contextmanager
> 
> 
> @contextmanager
> def nonblocking(stdin=None):
>     if stdin is None:
>         stdin = sys.stdin
> 
>     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)
Thanks for the reply. Is there no easy way to do so in python ?
I am using the raspberry pi with Wheezy and for the robot the GoPiGo which is connected on the raspberry pi.
The GoPiGo board has his own code like: fwd()="forward" bwd()="backward" right()="right" left="left" and so on.
I am just a dummie with python.

Thanks
----------------------------------------------------------

>     fcntl.fcntl(fd, fcntl.F_SETFL, oldflags | os.O_NONBLOCK)
>     def read(n):
>         try:
>             return stdin.read(n)
>         except IOError:
>             return ""
>     try:
>         yield read
>     finally:
>         termios.tcsetattr(fd, termios.TCSAFLUSH, oldterm)
>         fcntl.fcntl(fd, fcntl.F_SETFL, oldflags)
> 
> 
> Put the capture_key.py module into the same folder as your script and use it
> like in the demo below:
> 
> from capture_key import nonblocking
> 
> # put your code here
> 
> with nonblocking() as read:
>     print("letter s to stop:")
>     while True:
>         enable_servo()
>         servo(90)
>         mindist = 80
>         choices = read(1)
>         if choices == 's':
>             print("stop")
>             break
> if mindist > us_dist(15):
>     bwd()
>     print("backward 1x")




-- 
--------------------------------- --- -- -
Posted with NewsLeecher v7.0 Beta 2
Web @ http://www.newsleecher.com/?usenet
------------------- ----- ---- -- -




More information about the Python-list mailing list