Nano Hash - криптовалюты, майнинг, программирование

Как использовать кнопку на ЖК-дисплее вместо «кроме прерывания клавиатуры»?

Я пытаюсь заставить Wi-Fi (https://github.com/derv82/wifite) работать на моем Adafruit 16x2. LCD (http://www.adafruit.com/product/1110). Но по какой-то причине, если я нажму указанную кнопку, ничего не произойдет.

Я хочу заменить все фрагменты кода, которые выглядят так:

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

С кодом для ЖК-кнопок:

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

Но почему-то ничего не происходит, если я нажимаю кнопку, я не получаю ошибку - А wifite просто продолжает делать это тонко. Любая идея, почему это не работает так, как должно? Или, может быть, есть лучший способ?

06.07.2015

  • Если buttonPressed не возвращает объект типа исключения, я не думаю, что вы можете это сделать. Я думаю, вы хотите if lcd.buttonPressed(lcd.SELECT):. Но, конечно, вы не можете соединить try с if, так что это непростая работа по поиску/замене. 06.07.2015

Ответы:


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 --- это не повлияет на эти примеры кода --- любое "ложное" значение означает, что кнопка не была нажата).

Вы хотите поспать какое-то время между проверками. В своем примере они используют задержку в полсекунды; Я использовал десятую долю секунды. (Люди обычно воспринимают ответ в течение десятой доли секунды от компьютеризированного устройства как «мгновенный», в то время как задержка в полсекунды, как правило, немного раздражает). Если вы будете проверять как можно быстрее, это просто напрасно нагреет электронику. Даже 0,01 (одной сотой секунды) сна достаточно ... но 0,05-0,1, вероятно, лучшая практика для чего-то подобного.

06.07.2015
  • Спасибо, да, мне нужно было понять, что я не могу пойти по легкому пути и просто использовать структуру исключений и попыток с ЖК-дисплеем. Поэтому мне нужно было написать большой цикл, потребовалось немного времени, но теперь он работает так, как я хочу. Спасибо за очень подробный ответ, чувак. 11.07.2015
  • Использование блоков try:... except ...: в Python, как правило, не самый простой способ. Обработка исключений должна использоваться для обработки исключительных ситуаций, а обычное управление потоком должно быть предпочтительным для кода, обрабатывающего нормальный поток через вашу программу. Это руководство в целом облегчит чтение и сопровождение вашего кода другим пользователям. 12.07.2015
  • Я знаю, что это в общем-то не самый простой путь. Но если у меня есть готовый скрипт, использующий блоки try и exclude, было бы проще использовать одну из моих кнопок, чтобы заменить только Keyboardinterrupt в скрипте. 12.07.2015

  • 2

    Если я правильно понимаю, вы хотите, чтобы одна из кнопок на ЖК-панели Adafruit прерывала программу практически на любом этапе. (Было бы здорово, если бы вы сами упомянули об этом!)

    KeyboardInterrupt — это сигнал, посылаемый процессу, обычно когда пользователь нажимает Ctrl + c на клавиатуре. Чтобы быть более точным, сигнал отправляется ОС и перехватывается средой выполнения Python, что вызывает исключение KeyboardInterrupt.

    Однако Ctrl + c особенный! Практически в любом другом случае, когда пользователь нажимает клавишу или кнопку, это не преобразуется в специальный сигнал.

    Я не уверен, как вы можете получить желаемое поведение; это может сильно зависеть от используемой операционной системы.

    06.07.2015

    3

    Что вам нужно, так это обнаружение событий, попробуйте что-то вроде этого. Возможно, вам придется познакомиться с 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()
    

    Я понимаю, что это не полный ответ, но я надеюсь, что он поможет вам двигаться в правильном направлении.

    06.07.2015
  • root.after(100, main) вызовет main() только один раз. Чтобы он вызывался повторно, main() должен запланировать еще один вызов самому себе, например. имея еще один вызов root.after(100, main) в конце. 07.07.2015
  • @taleinat Вы правы. и пост отредактировал, спасибо 07.07.2015
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..