如何使用液晶显示屏上的按钮而不是“键盘中断除外”?

时间:2015-07-06 13:36:24

标签: python raspberry-pi

我试图让我的16x2 Adafruit LCD(https://github.com/derv82/wifite)上的wifite(http://www.adafruit.com/product/1110)工作。 但是出于某种原因,如果我按下指定的按钮就没有任何反应。

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

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

使用LCD按钮的代码:

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

但由于某种原因,如果我按下按钮没有任何反应,我没有得到错误 - 而且wifite只是继续做它很薄。 任何想法为什么这不起作用应该如何? 或者有更好的方法吗?

3 个答案:

答案 0 :(得分:1)

正如其他人所指出的那样except KeyboardInterrupt ...是Python中的特殊构造...因为[Ctrl] - [C]由终端驱动程序处理并向程序提供“中断”信号(SIGINT下) Unix,Linux和类似的操作系统)。 (在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()方法检查自上次清除按钮后是否按下按钮;但方法/函数不会阻止...它会返回TrueFalse(或可能None ---这不会影响这些代码示例---任何“false “值表示按钮未被按下。”

你想在两次检查之间睡一段时间。他们在他们的例子中使用半秒延迟;我使用了十分之一秒。 (人们通常会将计算机化设备在十分之一秒内的响应视为“瞬时”,而半秒延迟通常会略微烦人)。尽可能快地检查将不必要地加热电子设备。即使是0.01(百分之一秒)的睡眠就足够了......但0.05-0.1可能是这类事情的最佳实践。

答案 1 :(得分:0)

如果我理解正确,你想让Adafruit LCD面板上的一个按钮在几乎任何阶段中断程序。 (如果你自己提到这件事,那就太棒了!)

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

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

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

答案 2 :(得分:0)

你需要的是事件检测尝试这样的事情。您可能必须熟悉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()

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