在Python中扫描按键输入
我用时间模块暂停了一个脚本,比如说暂停了3500秒,方法是用time.sleep(3500)。
现在,我的目标是在脚本暂停的时候,扫描键盘的按键,也就是说在这行代码执行的时候。
简单来说,我想要在按下"Ctrl+R"的时候重新启动这个脚本。
比如说,考虑下面的代码:
#!/usr/bin/python
import time
print "Hello.. again"
while True:
time.sleep(3500)
现在,当代码执行到最后一行时,如果我按下Ctrl+R,我想要重新打印"Hello.. again"这一行。
3 个回答
-2
在一个循环里,每次暂停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
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 的解决方案可以在 这里找到
4
我知道这并不能完全回答你的问题,但你可以试试以下方法:
- 把程序的逻辑代码放到一个函数里,比如叫
perform_actions
。然后在程序开始的时候调用这个函数。 - 代码运行完后,开始监听一个 中断信号。
- 也就是说,用户需要按 ctrl+c,而不是 ctrl+r。
- 当收到中断信号后,等待半秒钟;如果再次按下 ctrl+c,那么就退出程序。
- 如果没有再次按下,就重新启动代码。
这样,一个中断就能像你希望的那样让 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>
。