python从命令行获取箭头键

时间:2014-08-14 02:01:53

标签: python

我有一个脚本应该与用户输入交互(按箭头键),但我无法获得密钥。我尝试了raw_input和其他一些功能,但它们没有用。这是我的示例代码,它应该是什么样的(在另一个函数中运行bool可以设置为False)

running = True
while running:
    #if input == Arrow_UP:
    #    do_Sth
    #elif ...
    display()
    time.sleep(1)

另一个问题是,我怎样才能每秒只调用一次显示功能,但会立即对输入作出反应?

1 个答案:

答案 0 :(得分:3)

有不同的情况:

  • 如果您使用TKinterPyGame等图形前端,则可以将事件绑定到箭头键并等待此事件。

    取自this answer的Tkinter示例:

    from Tkinter import *
    
    main = Tk()
    
    def leftKey(event):
        print "Left key pressed"
    
    def rightKey(event):
        print "Right key pressed"
    
    frame = Frame(main, width=100, height=100)
    main.bind('<Left>', leftKey)
    main.bind('<Right>', rightKey)
    frame.pack()
    main.mainloop()
    
  • 如果您的应用程序停留在终端中,请考虑使用curses中所述的this answer

    Curses旨在创建在终端(在linux下)运行的接口。

  • 如果使用curses,则在您进入应用程序时将清除终端的内容,并在退出时恢复。如果您不想要此行为,则可以使用getch()包装器,如this answer中所述。使用getch = _Getch()初始化getch后,您可以使用key = getch()

  • 存储下一个输入

至于如何每秒调用display(),它又取决于具体情况,但是如果你在终端中的单个进程中工作,那么进程在等待时将无法调用display()函数输入。解决方案是为display()函数使用不同的线程,如

import threading;

def display (): 
    threading.Timer(1., display).start ();
    print "display"

display ()

此处display每次调用时都会在将来安排一秒钟。您当然可以在此调用周围设置一些条件,以便在满足某些条件时进程停止,在您输入的情况下。有关更多讨论,请参阅this answer