我试图让我的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只是继续做它很薄。 任何想法为什么这不起作用应该如何? 或者有更好的方法吗?
答案 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()
方法检查自上次清除按钮后是否按下按钮;但方法/函数不会阻止...它会返回True
或False
(或可能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()
我意识到这不是一个完整的答案,但我希望它能让你朝着正确的方向前进