【问题标题】:python get arrow keys from command linepython从命令行获取箭头键
【发布时间】:2014-08-14 02:01:52
【问题描述】:

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

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

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

【问题讨论】:

  • 您好,感谢您的回答,但我的第二个问题仍未解决。使用 getch() 仅在按下一个键时调用显示函数,但我想在按下另一个键时每秒调用一次。
  • @vtni 请分别发布不同的问题

标签: python


【解决方案1】:

有不同的情况:

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

    Tkinter 中的示例取自this answer

    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 进行更深入的讨论。

【讨论】:

  • 非常感谢!这是一个终端脚本,所以我不能使用 Tkinter,但你的第二个建议使它与 getch 一起工作。我在循环之前调用 display()。
  • 我一直在尝试在 while 循环中使用 cv2.waitKey,当用户按下时会中断但没有运气,因为我希望代码在 selenium 上停止以允许我手动做一些事情并让它在没有明确等待的情况下运行,知道如何实现吗?
猜你喜欢
  • 2020-05-13
  • 1970-01-01
  • 2017-11-12
  • 1970-01-01
  • 1970-01-01
  • 2011-10-25
  • 2010-12-10
  • 1970-01-01
  • 2016-05-15
相关资源
最近更新 更多