Отображать изображение перед событием в микропитоне

Я пытаюсь использовать BBC:Microbit для отображения вспышки в течение 1 секунды на светодиодах при нажатии кнопки a. Это работает, но я хочу, чтобы он отображал анимацию (в режиме ожидания), пока он ждет нажатия кнопки. Приведенный ниже код показывает только изображение в режиме ожидания и не запускает остальную часть кода при нажатии кнопки a. Что я сделал не так? Спасибо.

from microbit import *

standby1 = Image("00000:"
             "00000:"
             "90000:"
             "00000:"
             "00000")

standby2 = Image("00000:"
             "00000:"
             "09000:"
             "00000:"
             "00000")

standby3 = Image("00000:"
             "00000:"
             "00900:"
             "00000:"
             "00000")

standby4 = Image("00000:"
             "00000:"
             "00090:"
             "00000:"
             "00000")

standby5 = Image("00000:"
             "00000:"
             "00009:"
             "00000:"
             "00000")

all_leds_on = Image("99999:"
             "99999:"
             "99999:"
             "99999:"
             "99999")

standby = [standby1, standby2, standby3, standby4, standby5, standby4, standby3, standby2]

display.show(standby, loop=True, delay=100)#Show standby LEDS on a loop

#Wait for button a to be pressed
while True:

    if button_a.was_pressed():
        sleep(1000)#pause program for 1 second
        display.show(all_leds_on) #Turn on LEDS for 1 second
        sleep(1000)#pause program for 1 second
        display.clear()

person JulianJ    schedule 03.01.2019    source источник
comment
Вы пробовали display.show(standby, loop=True, wait=False)   -  person phil    schedule 08.02.2019


Ответы (2)


Как сказал nekomatic, замена loop=True - это решение. Пожалуйста, найдите пример кода ниже.

Обработчики событий были бы более чистым способом обработки нажатий кнопок. В реализации микропитона на микробите отсутствуют обработчики событий, которые полная реализация микропитона, например. у пибордов есть. Обработчики событий доступны в компиляторах C, доступных для микробита.

from microbit import *

standby1 = Image("00000:"
             "00000:"
             "90000:"
             "00000:"
             "00000")

standby2 = Image("00000:"
             "00000:"
             "09000:"
             "00000:"
             "00000")

standby3 = Image("00000:"
             "00000:"
             "00900:"
             "00000:"
             "00000")

standby4 = Image("00000:"
             "00000:"
             "00090:"
             "00000:"
             "00000")

standby5 = Image("00000:"
             "00000:"
             "00009:"
             "00000:"
             "00000")

all_leds_on = Image("99999:"
             "99999:"
             "99999:"
             "99999:"
             "99999")

def flash_all():
    ''' Flash all LEDs on the display. '''
    display.show(all_leds_on)
    sleep(1000)
    display.clear()

standby = [standby1, standby2, standby3, standby4, standby5, 
        standby4, standby3, standby2]

while True:
    for image in standby:
        if button_a.was_pressed():
            flash_all()
        display.show(image)
        sleep(100)
person Oppy    schedule 07.01.2019

В документации для microbit.display.show говорится:

Если loop равно True, анимация будет повторяться вечно.

Поэтому вместо использования loop=True вам нужно написать свой собственный цикл Python for или while, который показывает один кадр из вашей анимации, проверяет, нажата ли кнопка, и выходит из цикла, если это так.

Вам нужно будет добавить временную задержку в этот цикл, и вам также нужно будет выяснить, как вернуться к первому кадру, когда вы показали последний - есть несколько способов сделать это.

person nekomatic    schedule 03.01.2019
comment
Спасибо за объяснение. Очень полезно. - person JulianJ; 03.01.2019