如何使用 LCD 上的按钮而不是 'except keyboard interrupt'?

How to use the button on a LCD instead of 'except keyboard interrupt'?

我正在尝试获取无线网络 (https://github.com/derv82/wifite) working on my 16x2 Adafruit LCD (http://www.adafruit.com/product/1110)。 但是由于某些原因,如果我按下指定的按钮,则没有任何反应。

我想替换所有看起来像这样的代码片段:

try
    ....
except KeyboardInterrupt:
    ....

使用 LCD 按钮的代码:

try
    ....
except lcd.buttonPressed(lcd.SELECT):
    ....

但出于某种原因,如果我按下按钮没有任何反应,我没有收到错误 - 而且 wifite 一直在做它的瘦身。 知道为什么这不起作用吗? 或者有更好的方法吗?

如果我没理解错的话,您想让 Adafruit LCD 面板上的按钮之一在几乎任何阶段中断程序。 (如果你自己提到这个就好了!)

KeyboardInterrupt 是发送到进程的信号,通常是当用户在键盘上按下 Ctrl + c 时。更准确地说,信号由 OS 发送并被 Python 运行时捕获,这会引发 KeyboardInterrupt 异常。

不过,Ctrl + c很特别!在几乎任何其他情况下,当用户按下按键或按钮时,这不会转换为特殊信号。

我不确定您如何获得您想要的行为;这可能在很大程度上取决于您使用的操作系统。

你需要的是事件检测尝试这样的事情。您可能需要熟悉 Tkinter

from Tkinter import *

root = Tk()

def callback_end(event)
   # do whatever ending procedure you want here 
   quit()

def main()
     # do everything in your main code here
     if lcd.buttonPressed(lcd.SELECT):
          callback_end("<End>")
     root.after(Period,main)

root.bind("<End>",callback_end) # if you press the end key it will call the callback_end function
root.after(Period,main) # repeats main every Period in miliseconds
root.mainloop()

我知道这不是一个完整的答案,但我希望它能让你朝着正确的方向前进

正如其他人指出的那样,except KeyboardInterrupt ... 是 Python 中的一个特殊结构 ... 因为 [Ctrl]-[C] 由您的终端驱动程序处理并显示 "Interrupt" 向您的程序发送信号(Unix、Linux 和类似操作系统下的 SIGINT)。 (在 Microsoft 操作系统下有类似的处理,细节不同,术语也略有不同;但是 Python 代码在任何一种方式下的工作方式都是一样的。

还有其他方法可以访问各种其他形式的硬件事件...并且 Python exception 模块不是实现这些的典型方法。

对于 AdaFruit 或其他 Rasberry Pi 设备,您将使用它们的包中包含的模块。您已经看过它,并且可能在您的代码中完成了所需的 import(基于您对 lcd.buttonPressed() 的引用)。问题是这根本不是您使用该功能的方式。

仔细阅读:https://blog.soton.ac.uk/pi/modules-available/adafruit-rgb-lcd-display/

...它包括展示您应该如何使用它的示例。那应该是这样的:

#!python
# Set up stuff here ...
got_event = False
while not got_event:
    if lcd.buttonPressed(lcd.SELECT)
        got_event = True
        break
    # Do other stuff, perhaps
    # Or time.sleep(0.1)?
if got_event:
    # In case we had other exit conditions from doing other stuff?
    subprocess.call(YOUR_OTHER_PROGRAM)

当然他们的代码是一个完整的运行程序。我在这里只强调几点。你需要循环直到你得到你正在寻找的事件(或者只要你的设备启动就永远循环处理这些事件)。

lcd.buttonPressed()方法正在检查按钮自上次被清除后是否被按下;但是 method/function 不会阻止......它 returns TrueFalse (或者可能 None ---这不会影响这些代码示例--- 任何 "false" 值表示按钮未被按下)。

您想在两次检查之间睡一段时间。他们在他们的例子中使用了半秒的延迟;我用了十分之一秒。 (人们通常会将来自计算机化设备的十分之一秒内的响应感知为 "instantaneous",而半秒的延迟通常会有点烦人)。尽可能快地检查只会不必要地加热电子设备。即使是 0.01(百分之一秒)的睡眠就足够了......但是 0.05-0.1 可能是这种情况的最佳实践。