Почему этот код отображает «A» при запуске без какого-либо ввода? - PullRequest
3 голосов
/ 26 июня 2019

Это переводчик азбуки Морзе для микробита, но в начале он отображает «A»

from microbit import *
morse={'.-': 'A', '-...': 'B', '-.-.': 'C', '-..': 'D', '.': 'E', '..-.': 'F', '--.': 'G', '....': 'H', '..': 'I', '.---': 'J', '-.-': 'K', '.-..': 'L', '--': 'M', '-.': 'N', '---': 'O', '.--.': 'P', '--.-': 'Q', '.-.': 'R', '...': 'S', '-': 'T', '..-': 'U', '...-': 'V', '.--': 'W', '-..-': 'X', '-.--': 'Y', '--..': 'Z', '.----': '1', '..---': '2', '...--': '3', '....-': '4', '.....': '5', '-....': '6', '--...': '7', '---..': '8', '----.': '9', '-----': '0', '--..--': ', ', '.-.-.-': '.', '..--..': '?', '-..-.': '/', '-....-': '-', '-.--.': '(', '-.--.-': ')'}

message=''
while True:
    morseChr=''
    if button_a.is_pressed:
        morseChr+='.'
    if button_b.is_pressed:
        morseChr+='-'
    if button_a.is_pressed and button_b.is_pressed:
        message+=morse[morseChr]
        display.show(message)
        sleep(1000*len(message))
        display.clear()

Я ожидаю, что он переведет нажатия кнопок в сообщение, но на нем просто отображается 'A'

1 Ответ

6 голосов
/ 26 июня 2019

Есть две проблемы с вашей текущей логикой:

Во-первых, всякий раз, когда вы нажимаете A и B одновременно, .- будет добавлено к вашему сообщению. Чтобы избежать этого, используйте else if и переместите сначала регистры A и B (потому что это должно иметь более высокий приоритет, чем просто A или B).

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

Кроме того, is_pressed является функцией в соответствии с документацией по микробитам.

Полученный код будет выглядеть так:

message=''
morseChr=''

while True:
    if button_a.is_pressed() and button_b.is_pressed():

        # First check if the entered char is actually valid
        if morseChr not in morse:
            morseChr='' # reset chars to avoid being stuck here endlessly
            # maybe also give feedback to the user that the morse code was invalid
            continue

        # add the char to the message
        message += morse[morseChr]
        morseChr=''

        display.show(message)
        sleep(1000*len(message))
        display.clear()

    elif button_a.is_pressed():
        morseChr+='.'

    elif button_b.is_pressed():
        morseChr+='-'
...