在Python中扫描按键输入

6 投票
3 回答
3176 浏览
提问于 2025-04-15 16:10

我用时间模块暂停了一个脚本,比如说暂停了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

我知道这并不能完全回答你的问题,但你可以试试以下方法:

  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>

撰写回答