【问题标题】:Scanning Keypress in Python在 Python 中扫描按键
【发布时间】:2010-12-18 06:36:03
【问题描述】:

我已经通过使用时间模块为 ex time.sleep(3500) 暂停了一个脚本 3500 秒。

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

如果按下 "keypress Ctrl+R",就像我想重新启动脚本一样。

例如……考虑

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

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

【问题讨论】:

  • 您可能想了解该网站的运作方式。到目前为止,您还没有投过一票,也没有接受过一个答案。那是不好的形式。
  • 对不起.. 我对这个论坛很陌生。

标签: python linux scripting


【解决方案1】:

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

  1. 将程序逻辑代码放入函数中,例如perform_actions。程序启动时调用它。
  2. 代码运行后,开始监听interrupt
    • 即用户必须按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 的解决方案会更好;)
  • ya.. 这也不错。我的意思是它现在解决了我的问题。但是,我想知道如何将它与任何其他组合一起使用...如果有人知道,请继续回复..
【解决方案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

【讨论】:

  • 为什么我不必要地运行循环?在程序处于睡眠状态时我们如何做到这一点。
【解决方案3】:

你可能想使用 Tkinter {needs 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 keybindings。另一个使用GTK的解决方案可以找到here

【讨论】:

  • 因为 Tkinker 不是标准模块。我希望有一个不同的解决方案。
  • IFAIK 如果不使用 X 或小部件库,就无法绑定键。所以你必须使用 qt、gtk 或 tkinter :) 你可能想访问kaizer.se/wiki/python-keybinder,它为 python 提出了一个键绑定机制。但这也不是标准的 python。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-18
  • 2014-09-19
  • 1970-01-01
  • 2020-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多