keyboard "interrupt"

Hans Georg Krauthäuser hgk at ieee.org
Wed Mar 19 09:48:59 CET 2008


On 18 Mrz., 22:18, johnmfis... at comcast.net (John Fisher) wrote:
> Hi Group,
>
> I have been absent a while, mainly because I have been getting better at
> figuring out my own Python problems. But not this one...
>
> I have a timed loop performing certain tasks until a total period of
> time has elapsed. I would like to be able to interrupt the loop or set
> various flags during execution via keyboard input. raw_input seems to
> just stop everything cold. I want the ability to just sacn the keyboard
> buffer and see if something is there, then proceed normally in the loop
> if there is no input in the buffer. Make sense? Totally easy? Let me
> know...
>
> wave_man

I use this code:

class _Getch:
    """Gets a single character from standard input.  Does not echo to
the
screen."""
    def __init__(self):
        try:
            self.impl = _GetchWindows()
        except ImportError:
            try:
                self.impl = _GetchUnix()
            except ImportError:
                self.impl = _GetchMacCarbon()

    def __call__(self): return self.impl()


class _GetchUnix:
    def __init__(self):
        import tty, sys, termios # import termios now or else you'll
get the Unix version on the Mac

    def __call__(self):
        import sys, tty, termios
        fd = sys.stdin.fileno()
        old_settings = termios.tcgetattr(fd)
        try:
            tty.setraw(sys.stdin.fileno())
            ch = sys.stdin.read(1)
        finally:
            termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
        return ch

class _GetchWindows:
    def __init__(self):
        import msvcrt

    def __call__(self):
        import msvcrt
        return getch()


class _GetchMacCarbon:
    """
    A function which returns the current ASCII key that is down;
    if no ASCII key is down, the null string is returned.  The
    page http://www.mactech.com/macintosh-c/chap02-1.html was
    very helpful in figuring out how to do this.
    """
    def __init__(self):
        import Carbon

    def __call__(self):
        import Carbon
        if Carbon.Evt.EventAvail(0x0008)[0]==0: # 0x0008 is the
keyDownMask
            return ''
        else:
            #
            # The event contains the following info:
            # (what,msg,when,where,mod)=Carbon.Evt.GetNextEvent(0x0008)
[1]
            #
            # The message (msg) contains the ASCII char which is
            # extracted with the 0x000000FF charCodeMask; this
            # number is converted to an ASCII character with chr()
and
            # returned
            #
            (what,msg,when,where,mod)=Carbon.Evt.GetNextEvent(0x0008)
[1]

            return chr(msg & 0x000000FF)

Best regards
Hans Georg



More information about the Python-list mailing list