Return Styles: Pseud0ch, Terminal, Valhalla, NES, Geocities, Blue Moon. Entire thread

getchar() in python

Name: Anonymous 2009-03-13 20:23

is it possible?

Name: Anonymous 2009-03-14 9:13

>>16
Alright, you were right. I must have confused this with nonblocking mode.

In any case, enjoy my ENTERPRISE CROSS-PLATFORM implementation for getch.

def getch():
    """ Read a character without actually pressing Enter. """
    import sys
    if sys.platform == 'win32':
        # Enjoy your AIDS
        import ctypes
        # Set up functions, constants, etc
        kernel32 = ctypes.windll.kernel32
        HANDLE = ctypes.c_void_p
        DWORD = ctypes.c_ulong
        LPDWORD = ctypes.POINTER(ctypes.c_ulong)
        LPVOID = ctypes.c_void_p
        # GetStdHandle
        STD_INPUT_HANDLE = ctypes.c_ulong(-10)
        GetStdHandle = kernel32.GetStdHandle
        GetStdHandle.argtypes = [DWORD]
        GetStdHandle.restype = HANDLE
        # GetConsoleMode
        ENABLE_ECHO_INPUT = 0x4L
        ENABLE_LINE_INPUT = 0x2L
        GetConsoleMode = kernel32.GetConsoleMode
        GetConsoleMode.argtypes = [HANDLE, LPDWORD]
        GetConsoleMode.restype = bool
        # SetConsoleMode
        SetConsoleMode = kernel32.SetConsoleMode
        SetConsoleMode.argtypes = [HANDLE, DWORD]
        SetConsoleMode.restype = bool
        # ReadConsole
        ReadConsole = kernel32.ReadConsoleW
        ReadConsole.argtypes = [HANDLE, LPVOID, DWORD, LPDWORD, LPVOID]
        ReadConsole.restype = bool
        # Get console handle
        handle = GetStdHandle(STD_INPUT_HANDLE)
        if long(handle) == -1L:
            raise WindowsError, 'Unable to obtain STDIN handle'

        # Store old mode
        oldmode = DWORD()
        success = GetConsoleMode(handle, ctypes.byref(oldmode))
        if not success:
            raise WindowsError, 'Unable to get console mode'

        try:
            # Change mode
            newmode = oldmode.value & ~(ENABLE_ECHO_INPUT | ENABLE_LINE_INPUT)
            success = SetConsoleMode(handle, newmode)
            if not success:
                raise WindowsError, 'Unable to set console mode'

            # Read input
            buffer = ctypes.create_unicode_buffer('', 1)
            chars_read = DWORD()
            success = ReadConsole(handle, ctypes.byref(buffer), 1, ctypes.byref(chars_read), None)
            if not success:
                raise WindowsError, 'Console read failed'
        finally:
            SetConsoleMode(handle, oldmode)

        return buffer.value

    else:
        import termios
       
        oldflags = termios.tcgetattr(sys.stdin.fileno())
        newflags = list(oldflags)
        # Set non-canonical mode
        newflags[3] &= ~(termios.ICANON | termios.ECHO)
        try:
            termios.tcsetattr(sys.stdin.fileno(), termios.TCSANOW, newflags)
            chars = sys.stdin.read(1)
        finally:
            termios.tcsetattr(sys.stdin.fileno(), termios.TCSANOW, oldflags)
       
        return chars.decode()

Newer Posts
Don't change these.
Name: Email:
Entire Thread Thread List