在Python中扫描Keypress

时间:2009-11-19 11:36:29

标签: python linux scripting

我已经暂停了一个脚本,让我们说使用时间模块为时间为3500秒.sleep(3500)。

现在,我的目标是在脚本处于睡眠状态时扫描按键,我的意思是它在这一行。

就像我想要在按下“按下Ctrl + R”的情况下重启脚本一样。

对于前..考虑

#!/usr/bin/python
import time
print "Hello.. again"
while True:
     time.sleep(3500)

现在代码在最后一行,如果按Ctrl + R,我想重新打印“Hello .. again”行。

3 个答案:

答案 0 :(得分:4)

我知道这并不完全回答您的问题,但您可以执行以下操作:

  1. 将程序逻辑代码放在一个函数中,比如perform_actions。程序启动时调用它。
  2. 运行代码后,开始侦听interrupt
    • 也就是说,用户必须按 ctrl + c 而不是 ctrl + r
  3. 收到中断后,请等待半秒钟;如果再次按 ctrl + c ,则退出。
  4. 否则,请重新启动代码。
  5. 因此,一个中断的行为与您希望 ctrl + r 的行为相同。两个快速中断退出程序。

    import time
    
    def perform_actions():
        print("Hello.. again")
    
    try:
        while True:
            perform_actions()
            try:
                while True: time.sleep(3600)
            except KeyboardInterrupt:
                time.sleep(0.5)
    except KeyboardInterrupt:
        pass
    

    使用信号(在这种情况下为SIGINT)的一个很好的副作用是您还可以通过其他方式重新启动脚本,例如通过运行kill -int <pid>

答案 1 :(得分:3)

您可能想要使用Tkinter {需要X:(}

#!/usr/bin/env python

from Tkinter import * # needs python-tk

root = Tk()

def hello(*ignore):
    print 'Hello World'

root.bind('<Control-r>', hello)
root.mainloop() # starts an X widget

如果按Hello World

,此脚本会将ctrl+r打印到控制台

另见Tkinter keybindings。另一种使用GTK的解决方案可以找到here

答案 2 :(得分:-2)

在for循环中休眠3500次,持续1秒,检查每次按键是否按下

# sleep for 3500 seconds unless ctrl+r is pressed
for i in range(3500):
    time.sleep(1)
    # check if ctrl+r is pressed
    # if pressed -> do something
    # otherwise go back to sleep