纽扣¶
到目前为止,我们已经创建了使设备执行某些操作的代码。这称为 输出。但是,我们还需要设备对事物做出反应。这些东西被称为输入。
很容易记住:输出是设备向世界输出的内容,而输入是进入设备进行处理的内容。
micro:bit 上最明显的输入方式是它的两个按钮,标记为
A
和 B
。不知何故,我们需要 MicroPython 对按钮按下做出反应。
这非常简单:
from microbit import *
sleep(10000)
display.scroll(str(button_a.get_presses()))
此脚本所做的只是休眠一万毫秒(即 10 秒),然后滚动您按下 button 的次数 A
。就是这样!
虽然这是一个非常无用的脚本,但它引入了一些有趣的新想法:
- 该
sleep
函数将使 micro:bit 休眠一定的毫秒数。如果你想暂停你的程序,这是如何做到的。一个函数就像一个方法,但它不是通过一个点附加到一个 对象上。 - 有一个被调用的对象
button_a
,它允许您获取使用get_presses
方法按下的次数。
由于 get_presses
给出了一个数值并且display.scroll
只显示字符,所以我们需要将数值转换为字符串。我们使用str
函数(“字符串”的缩写~它将事物转换为字符串)来做到这一点。
第三行有点像洋葱。如果括号是洋葱皮,那么您会注意到display.scroll
包含 str
本身包含 button_a.get_presses
.Python 尝试在开始下一层之前首先计算出最内层的答案。这称为 嵌套- 相当于俄罗斯套娃的编码。
![../_images/matrioshka.jpg](../_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
,
Bacon
和Tomatoes
显然是有关系的 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
方法只产生两个结果: True
或False
.
。如果您按下按钮,则返回True
,否则返回
False
。上面的代码用英语说,“永远,如果按下按钮 A 则显示一张快乐的脸,否则如果按下按钮 B 则跳出循环,否则显示一张悲伤的脸。” 我们用 break
语句跳出循环(永远停止程序运行)。
最后,当网络宠物死了,我们clear
展示。
你能想办法让这个游戏不那么悲惨吗?你如何检查 两个按钮是否被按下?(提示:Python 有和
, or
and not
逻辑运算符来帮助检查多个真值陈述(产生True
或产生False
结果的事物)。