Кнопки

Buttons

Эта страница посвящена кнопкам на интеллектуальном блоке EV3, а не кнопке сенсорного датчика. Официальная документация находится ЗДЕСЬ . Вот несколько коротких сценариев, демонстрирующих использование класса Button().Подождите, пока ударВ новой библиотеке EV3 Python (v2) есть несколько замечательных новых функций кнопок, таких как wait_for_bump(buttons) . «Удар» — это нажатие и отпускание кнопки. Существуют также функции wait_for_pressed(кнопки) и wait_for_released(кнопки) , которые работают аналогичным образом. Вот сценарий, демонстрирующий использование новых функций. Он ждет, пока не будет нажата левая кнопка, затем издает звуковой сигнал, затем ждет, пока не будет нажата кнопка вверх или вниз, затем издает звуковой сигнал, затем ждет, пока правая кнопка не будет (нажата и) не отпущена, затем издает звуковой сигнал.    
По состоянию на октябрь 2018 года эти функции не работают должным образом — они будут исправлены в следующем выпуске.
#!/usr/bin/env python3
from ev3dev2.button import Button
from ev3dev2.sound import Sound

btn = Button()
sound = Sound()

btn.wait_for_bump(‘слева’)звук.бип()btn.wait_for_pressed([‘вверх’, ‘вниз’])звук.бип()btn.wait_for_released(‘правильно’)звук.бип()
Нажмите любую кнопку, чтобы выйтиЦикл проверяет, нажата ли какая-либо кнопка, и если да, то издает звуковой сигнал и выходит из сценария. Скрипт проверяет состояние кнопки каждые 0,01 секунды.
#!/usr/bin/env python3from ev3dev2.button import Buttonfrom ev3dev2.sound import Soundfrom time import sleep
btn = Button()sound = Sound()
while True:    if btn.any():    # Checks if any button is pressed.        sound.beep()  # Wait for the beep to finish.        exit()  # Stop the program.    else:        sleep(0.01)  # Wait 0.01 second
Вот гораздо более аккуратная версия приведенного выше скрипта:
#!/usr/bin/env python3from ev3dev2.button import Buttonfrom ev3dev2.sound import Soundfrom time import sleep
btn = Button()sound = Sound()
while not btn.any(): # While no (not any) button is pressed.    sleep(0.01)  # Wait 0.01 second
sound.beep()
Вы можете подумать, что это плохие примеры, потому что функцию wait_for_bump() можно было бы использовать для создания более короткого и ясного сценария, но на самом деле второй приведенный выше сценарий — это хороший способ использовать нажатие кнопки для выхода из цикла и, возможно, завершения программы.
Реагировать на нажатия и отпускания кнопокВ цикле этого скрипта выделенная команда btn.process() проверяет любое изменение состояния кнопок. Если он обнаруживает изменение, он запускает соответствующие «события». Например, если он обнаруживает, что левая кнопка только что была нажата, он запускает событие «изменение состояния левой кнопки», называемое on_left, а также событие «изменения кнопки», называемое on_change . Он также присваивает состоянию параметра значение True , если кнопка нажата, и False , если кнопка отпущена. Обработчики событий реагируют на события. Например, если нажата левая кнопка, то событие «изменение состояния левой кнопки» вызовет выделенный элемент on_left.обработчик события, который вызовет выделенную функцию ‘ left ‘ (функция не обязательно должна иметь это имя).
#!/usr/bin/env python3from ev3dev2.button import Buttonfrom time import sleep
btn = Button()
# Do something when state of any button changes:  def left(state):    if state:        print('Left button pressed')    else:        print('Left button released')    def right(state):  # neater use of 'if' follows:    print('Right button pressed' if state else 'Right button released')    def up(state):    print('Up button pressed' if state else 'Up button released')    def down(state):    print('Down button pressed' if state else 'Down button released')    def enter(state):    print('Enter button pressed' if state else 'Enter button released')    btn.on_left = leftbtn.on_right = rightbtn.on_up = upbtn.on_down = downbtn.on_enter = enter
# This loop checks button states continuously (every 0.01s). Если новое состояние отличается от старого, то соответствующее#  Вызываются обработчики событий кнопок.while True:    btn.process()    sleep(0.01)
Если вы запускаете этот скрипт из VS Code, нажмите кнопку остановки, чтобы выйти. если вы работаете из Brickman, нажмите и удерживайте кнопку возврата, чтобы выйти.
Получить список измененных состояний кнопокФункциональность этого скрипта аналогична предыдущему, но он использует обработчик событий on_change(changed_buttons) для получения гораздо более лаконичного сценария. Он не только отображает измененные состояния кнопок, но и реагирует на нажатие определенной кнопки. Нажмите кнопку остановки (VS Code) или нажмите и удерживайте кнопку возврата (Brickman), чтобы завершить сценарий.
#!/usr/bin/env python3from ev3dev2.button import Buttonfrom time import sleep
btn = Button()
def change(changed_buttons):   # changed_buttons is a list of # tuples of changed button names and their states.    print('These buttons changed state: ' + str(changed_buttons))    if ('left', True) in changed_buttons:        print('You pressed the left button')
btn.on_change = change
# This loop checks button states# continuously and calls appropriate event handlerswhile True:    btn.process()    sleep(0.01)
Проверить состояния кнопокВ предыдущем сценарии было показано, как можно использовать process() и соответствующие ему обработчики событий для обнаружения и реагирования на ИЗМЕНЕНИЯ состояния. Существуют также функции ( вниз , влево , ввод и т. д.), которые просто определяют СОСТОЯНИЕ кнопок. Состояние True, если кнопка нажата, и False в противном случае. Сценарий ниже проверяет и отображает состояние левой кнопки раз в секунду. Вы можете завершить сценарий односекундным нажатием на кнопку Backspace.
#!/usr/bin/env python3# prints the state of the left button (True or False) every second# When left button is pressed the string '^[[D' is also printedfrom ev3dev2.button import Buttonfrom time import sleep
btn = Button()
while not btn.backspace:    print(btn.left)    sleep(1)
Другие функции кнопокСледующий скрипт демонстрирует еще две функции: buttons_pressed и check_buttons() . Функция  check_buttons() проверяет, соответствуют ли в данный момент нажатые кнопки заданному списку, а затем возвращает True или False. Каждую секунду печатается список нажатых кнопок, и  вы можете закончить скрипт, нажав ТОЛЬКО левую и правую кнопки одновременно.
#!/usr/bin/env python3# Every second a list of the pressed buttons is printed# and you can end the script by pressing# ONLY the left and right buttons simultaneously.from ev3dev2.button import Buttonfrom time import sleep
btn = Button()
while True:    print(btn.buttons_pressed)    if btn.check_buttons(buttons=['left','right']):        exit()    sleep(1)