我想让wifite (https://github.com/derv82/wifite)在我的16x2AdafruitLCD (http://www.adafruit.com/product/1110)上工作。但出于某种原因,如果我按下指定的按钮,什么都不会发生。
我想替换如下的所有代码:
try
....
except KeyboardInterrupt:
....使用LCD按钮的代码:
try
....
except lcd.buttonPressed(lcd.SELECT):
....但出于某种原因,如果我按下按钮,我就不会出错-- wifite只是一直这样做。你知道为什么这不管用吗?还是有更好的办法?
发布于 2015-07-06 23:55:21
正如其他人所指出的,except KeyboardInterrupt ...是Python中的一个特殊构造。因为Ctrl由您的终端驱动程序处理,并向您的程序(在Unix、Linux和类似操作系统下的SIGINT)显示一个“中断”信号。(在Microsoft操作系统下也有类似的处理,有不同的细节和略有不同的术语;但是Python代码的工作方式是相同的。
有其他方法可以访问各种其他形式的硬件事件..。而Python模块并不是实现这些模块的典型方式。
对于AdaFruit或其他Rasberry设备,您可以使用它们在包中包含的模块。您已经看到了它,并可能在代码中完成了所需的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可能是这样的最佳实践。
发布于 2015-07-06 13:59:38
如果我理解正确的话,你想让Adafruit液晶面板上的一个按钮在几乎任何阶段中断程序。(如果你自己提过这件事,那就太好了!)
KeyboardInterrupt是发送给进程的信号,通常是当用户按下键盘上的Ctrl + c时。更准确地说,一个信号是由操作系统发送并被Python运行时捕获的,这会引发一个KeyboardInterrupt异常。
然而,Ctrl + c是特别的!在几乎任何其他情况下,当用户按下一个键或按钮时,这不会被转换成一个特殊的信号。
我不知道如何才能得到您想要的行为;这可能在很大程度上取决于您正在使用的操作系统。
发布于 2015-07-06 22:29:09
您需要的是事件检测,尝试这样的方法。你可能得熟悉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()我意识到这不是一个完整的答案,但我希望它能让你朝着正确的方向前进。
https://stackoverflow.com/questions/31247313
复制相似问题