raw_input in python without pressing enter

后端 未结 8 1495
情歌与酒
情歌与酒 2020-11-22 15:41

I\'m using raw_input in Python to interact with user in shell.

c = raw_input(\'Press s or n to continue:\')
if c.upper() == \'S\':
    print \'Y         


        
相关标签:
8条回答
  • 2020-11-22 16:17

    curses can do that as well :

    import curses, time
    
    def input_char(message):
        try:
            win = curses.initscr()
            win.addstr(0, 0, message)
            while True: 
                ch = win.getch()
                if ch in range(32, 127): 
                    break
                time.sleep(0.05)
        finally:
            curses.endwin()
        return chr(ch)
    
    c = input_char('Do you want to continue? y/[n]')
    if c.lower() in ['y', 'yes']:
        print('yes')
    else:
        print('no (got {})'.format(c))
    
    0 讨论(0)
  • I know this is old, but the solution wasn't good enough for me. I need the solution to support cross-platform and without installing any external Python packages.

    My solution for this, in case anyone else comes across this post

    Reference: https://github.com/unfor19/mg-tools/blob/master/mgtools/get_key_pressed.py

    from tkinter import Tk, Frame
    
    
    def __set_key(e, root):
        """
        e - event with attribute 'char', the released key
        """
        global key_pressed
        if e.char:
            key_pressed = e.char
            root.destroy()
    
    
    def get_key(msg="Press any key ...", time_to_sleep=3):
        """
        msg - set to empty string if you don't want to print anything
        time_to_sleep - default 3 seconds
        """
        global key_pressed
        if msg:
            print(msg)
        key_pressed = None
        root = Tk()
        root.overrideredirect(True)
        frame = Frame(root, width=0, height=0)
        frame.bind("<KeyRelease>", lambda f: __set_key(f, root))
        frame.pack()
        root.focus_set()
        frame.focus_set()
        frame.focus_force()  # doesn't work in a while loop without it
        root.after(time_to_sleep * 1000, func=root.destroy)
        root.mainloop()
        root = None  # just in case
        return key_pressed
    
    
    def __main():
            c = None
            while not c:
                    c = get_key("Choose your weapon ... ", 2)
            print(c)
    
    if __name__ == "__main__":
        __main()
    
    0 讨论(0)
提交回复
热议问题