在Python中扫描按键

6

我使用time模块中的time.sleep(3500)命令让一个脚本暂停了3500秒。

现在,我的目标是在脚本休眠时(也就是在这一行上),扫描按键。

我的意思是,如果按下"Ctrl+R" ,则重新启动脚本。

例如,请考虑以下内容:

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

现在,当代码执行到最后一行时,如果我按下Ctrl+R,我希望重新打印“Hello.. again”这一行。

4
你可能希望了解一下这个网站的运作方式。到目前为止,你还没有投过任何票,也没有接受过任何答案。这是不好的行为举止。 - Stephan202
重复:https://dev59.com/rnRB5IYBdhLWcg3wLkxM - S.Lott
抱歉..我很新在这个论坛。 - shadyabhi
3个回答

4
我知道这并不能完全回答你的问题,但你可以按照以下步骤进行:
  1. 将程序逻辑代码放入一个函数中,比如说perform_actions。在程序启动时调用该函数。
  2. 在代码运行后,开始监听中断信号
    • 也就是说,用户必须按下ctrl+c而不是ctrl+r
  3. 接收到中断信号后,等待半秒钟;如果再次按下ctrl+c,则退出。
  4. 否则,重新启动代码。
因此,一个中断的行为类似于你想要的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>

使用Ctrl+R的解决方案会更好 ;) - tuergeist
哎呀,这个也不错。我是指它暂时解决了我的问题。但是,我想知道如何将其与其他组合使用... 如果有人知道,请继续回复。 - shadyabhi

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

这个脚本会在按下ctrl+r时,在控制台打印Hello World。另外,查看Tkinter键盘绑定。还有一种解决方案使用GTK,可以在这里找到。

由于Tkinker不是标准模块,我希望能有其他解决方案。 - shadyabhi
据我所知,没有办法在不使用X或小部件库的情况下绑定键。因此,您必须使用qt、gtk或tkinter :) 您可能希望访问http://kaizer.se/wiki/python-keybinder/,该网站为Python提供了一种键绑定机制。但这也不是标准的Python。 - tuergeist

-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

1
为什么我会不必要地运行循环?在程序处于睡眠状态时,我们该如何处理它。 - shadyabhi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接