如何使用 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 True
或 False
(或者可能 None
---这不会影响这些代码示例--- 任何 "false" 值表示按钮未被按下)。
您想在两次检查之间睡一段时间。他们在他们的例子中使用了半秒的延迟;我用了十分之一秒。 (人们通常会将来自计算机化设备的十分之一秒内的响应感知为 "instantaneous",而半秒的延迟通常会有点烦人)。尽可能快地检查只会不必要地加热电子设备。即使是 0.01(百分之一秒)的睡眠就足够了......但是 0.05-0.1 可能是这种情况的最佳实践。
我正在尝试获取无线网络 (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 True
或 False
(或者可能 None
---这不会影响这些代码示例--- 任何 "false" 值表示按钮未被按下)。
您想在两次检查之间睡一段时间。他们在他们的例子中使用了半秒的延迟;我用了十分之一秒。 (人们通常会将来自计算机化设备的十分之一秒内的响应感知为 "instantaneous",而半秒的延迟通常会有点烦人)。尽可能快地检查只会不必要地加热电子设备。即使是 0.01(百分之一秒)的睡眠就足够了......但是 0.05-0.1 可能是这种情况的最佳实践。