python 从命令行获取箭头键

vtn*_*tni 4 python

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

running = True
while running:
    #if input == Arrow_UP:
    #    do_Sth
    #elif ...
    display()
    time.sleep(1)
Run Code Online (Sandbox Code Playgroud)

另一个问题是,如何每秒只调用一次显示函数,但立即对输入做出反应?

Max*_*xim 7

有不同的情况:

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

    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()
    
    Run Code Online (Sandbox Code Playgroud)
  • 如果您的应用程序停留在终端中,请考虑使用本答案中所述的curses

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

  • 如果您使用curses,则进入应用程序时终端的内容将被清除,退出应用程序时将恢复终端的内容。如果您不希望出现这种行为,可以使用 getch() 包装器,如本答案中所述。使用 初始化 getch 后getch = _Getch(),您可以使用存储下一个输入key = getch()

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

import threading;

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

display ()
Run Code Online (Sandbox Code Playgroud)

display每次调用时,这里都会将自己安排在未来一秒。当然,您可以在此调用周围设置一些条件,以便在满足某些条件时(在您的情况下,当给出输入时)该过程停止。请参阅此答案以进行更深入的讨论。