首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用LCD上的按钮而不是“除了键盘中断”?

如何使用LCD上的按钮而不是“除了键盘中断”?
EN

Stack Overflow用户
提问于 2015-07-06 13:36:23
回答 3查看 595关注 0票数 0

我想让wifite (https://github.com/derv82/wifite)在我的16x2AdafruitLCD (http://www.adafruit.com/product/1110)上工作。但出于某种原因,如果我按下指定的按钮,什么都不会发生。

我想替换如下的所有代码:

代码语言:javascript
复制
try
    ....
except KeyboardInterrupt:
    ....

使用LCD按钮的代码:

代码语言:javascript
复制
try
    ....
except lcd.buttonPressed(lcd.SELECT):
    ....

但出于某种原因,如果我按下按钮,我就不会出错-- wifite只是一直这样做。你知道为什么这不管用吗?还是有更好的办法?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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/

..。它包括示例,说明您应该如何使用它。应该是这样的:

代码语言:javascript
复制
#!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
EN

Stack Overflow用户

发布于 2015-07-06 13:59:38

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

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

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

我不知道如何才能得到您想要的行为;这可能在很大程度上取决于您正在使用的操作系统。

票数 0
EN

Stack Overflow用户

发布于 2015-07-06 22:29:09

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

代码语言:javascript
复制
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()

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31247313

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档