Python从命令行获取箭头键

4 投票
1 回答
22229 浏览
提问于 2025-04-18 17:14

我有一个脚本,应该能和用户的输入互动(比如按箭头键),但是我无法获取到这些按键。我试过用raw_input和其他一些函数,但都没成功。下面是我的示例代码,应该是这个样子(运行的布尔值可以在另一个函数中设置为False)。

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

还有一个问题是,我该如何让显示函数每秒只调用一次,但又能立即对输入做出反应呢?

1 个回答

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()
    
  • 如果你的应用程序是在终端中运行的,可以考虑使用 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 ()

这里的 display 每次被调用时都会安排自己在一秒后再次调用。当然,你可以在这个调用周围加上一些条件,这样当满足某些条件时,进程就会停止,比如说当有输入时。想了解更多,可以参考 这个回答

撰写回答