纽扣

到目前为止,我们已经创建了使设备执行某些操作的代码。这称为 输出。但是,我们还需要设备对事物做出反应。这些东西被称为输入。

很容易记住:输出是设备向世界输出的内容,而输入是进入设备进行处理的内容。

micro:bit 上最明显的输入方式是它的两个按钮,标记为 AB。不知何故,我们需要 MicroPython 对按钮按下做出反应。

这非常简单:

from microbit import *

sleep(10000)
display.scroll(str(button_a.get_presses()))

此脚本所做的只是休眠一万毫秒(即 10 秒),然后滚动您按下 button 的次数 A。就是这样!

虽然这是一个非常无用的脚本,但它引入了一些有趣的新想法:

  1. sleep函数将使 micro:bit 休眠一定的毫秒数。如果你想暂停你的程序,这是如何做到的。一个函数就像一个方法,但它不是通过一个点附加到一个 对象上。
  2. 有一个被调用的对象button_a ,它允许您获取使用get_presses方法按下的次数。

由于 get_presses 给出了一个数值并且display.scroll 只显示字符,所以我们需要将数值转换为字符串。我们使用str函数(“字符串”的缩写~它将事物转换为字符串)来做到这一点。

第三行有点像洋葱。如果括号是洋葱皮,那么您会注意到display.scroll包含 str 本身包含 button_a.get_presses.Python 尝试在开始下一层之前首先计算出最内层的答案。这称为 嵌套- 相当于俄罗斯套娃的编码。

../_images/matrioshka.jpg

假设您已按下按钮 10 次。下面是 Python 如何计算出第三行发生的事情:

Python 看到完整的行并获取以下值get_presses:

display.scroll(str(button_a.get_presses()))

既然 Python 知道按下了多少次按钮,它会将数值转换为字符串:

display.scroll(str(10))

最后,Python 知道要滚动显示的内容:

display.scroll("10")

虽然这似乎需要大量工作,但 MicroPython 使这一切发生得异常快。

事件循环

通常你需要你的程序等待一些事情发生。为此,您需要让它围绕一段代码循环,该代码定义了如何对某些预期事件(例如按下按钮)做出反应。

要在 Python 中创建循环,请使用while关键字。它检查是否有东西True。如果是,它会运行一个称为循环体的代码块。如果不是,它会跳出循环(忽略主体)并且程序的其余部分可以继续。

Python 使定义代码块变得容易。假设我有一个写在一张纸上的待办事项清单。它可能看起来像这样:

Shopping
Fix broken gutter
Mow the lawn

如果我想进一步分解我的待办事项清单,我可能会这样写:

Shopping:
    Eggs
    Bacon
    Tomatoes
Fix broken gutter:
    Borrow ladder from next door
    Find hammer and nails
    Return ladder
Mow the lawn:
    Check lawn around pond for frogs
    Check mower fuel level

很明显,主要任务被分解为子任务,这些子任务 缩进在与其相关的主要任务之下。所以 Eggs, BaconTomatoes 显然是有关系的 Shopping。通过缩进事物,我们可以一目了然地轻松查看任务之间的关系。

这称为嵌套。我们使用嵌套来定义这样的代码块:

from microbit import *

while running_time() < 10000:
    display.show(Image.ASLEEP)

display.show(Image.SURPRISED)

running_time函数返回自设备启动以来的毫秒数。

while running_time() < 10000:该行检查运行时间是否小于 10000 毫秒(即 10 秒)。如果是,并且这是我们可以看到作用域划分的地方,那么它将显示 Image.ASLEEP. 请注意这是如何在while语句下方缩进的,就像在我们的待办事项列表中一样。

显然,如果运行时间等于或大于 10000 毫秒,那么显示屏将显示Image.SURPRISED。为什么?因为while条件将是 False (running_time 不再是)。在这种情况下,循环结束,程序将在 循环的代码块之后继续。您的设备看起来像是睡着了 10 秒钟,然后醒来时脸上会露出惊讶的表情。 < 10000. while

尝试一下!

处理事件

如果我们希望 MicroPython 对按钮按下事件做出反应,我们应该将它放入一个无限循环中并检查 button is_pressed.

无限循环很简单:

while True:
    # Do stuff

(请记住,如果它应该运行它的代码块,while 检查它是否 True 可以解决问题。因为True 显然 True一直如此,你会得到一个无限循环!)

让我们制作一个非常简单的网络宠物。除非你按下按钮,否则总是很难过A。如果你按下按钮B 它会死。(我意识到这不是一个非常愉快的游戏,所以也许你可以想出如何改进它。):

from microbit import *

while True:
    if button_a.is_pressed():
        display.show(Image.HAPPY)
    elif button_b.is_pressed():
        break
    else:
        display.show(Image.SAD)

display.clear()

你能看到我们如何检查按下了哪些按钮吗?我们使用了 if, elif(“else if”的缩写)和else。这些被称为条件 ,其工作方式如下:

if something is True:
    # do one thing
elif some other thing is True:
    # do another thing
else:
    # do yet another thing.

这与英语非常相似!

is_pressed 方法只产生两个结果: TrueFalse. 。如果您按下按钮,则返回True,否则返回 False。上面的代码用英语说,“永远,如果按下按钮 A 则显示一张快乐的脸,否则如果按下按钮 B 则跳出循环,否则显示一张悲伤的脸。” 我们用 break语句跳出循环(永远停止程序运行)。

最后,当网络宠物死了,我们clear展示。

你能想办法让这个游戏不那么悲惨吗?你如何检查 两个按钮是否被按下?(提示:Python 有, or and not 逻辑运算符来帮助检查多个真值陈述(产生True或产生False 结果的事物)。