按钮
到目前为止,我们写的程序主要是让 micro:bit 做些什么——这叫输出。但设备也需要感知外界变化,这些被感知的东西叫输入。
很好记:输出是设备向外界「放出去」的东西;输入是进入设备、等待程序处理的东西。
micro:bit 上最明显的输入就是两个按钮,标为 A 和 B。我们需要让 BiBoPython 对按钮按下做出反应。
统计按键次数
这非常简单:
from bibo import *
sleep(10000)
display.scroll(str(button_a.get_presses()))
这段程序先休眠 10000 毫秒(即 10 秒),然后在屏幕上滚动显示你按下按钮 A 的次数。就这些!
虽然功能很「没用」,但引入了两个新概念:
sleep函数会让 micro:bit 暂停指定毫秒数。想在程序里加停顿,就用它。函数和方法类似,但不通过.挂在某个对象上。- 有一个叫
button_a的对象,可用get_presses方法获取它被按下的次数。
get_presses 返回的是数字,而 display.scroll 只能显示字符,所以要用 str 函数(string 的缩写)把数字转成字符串。
第三行有点像「洋葱」:若把圆括号比作洋葱皮,display.scroll 包着 str,str 又包着 button_a.get_presses。Python 会先算最里层,再一层层向外——这叫嵌套,像俄罗斯套娃。

假设你按了 10 次,Python 会这样处理第三行:
先看整行,得到 get_presses 的值:
display.scroll(str(button_a.get_presses()))
知道次数后,把数字转成字符串:
display.scroll(str(10))
最后滚动显示:
display.scroll("10")
看起来步骤不少,但 BiBoPython 执行得极快。
事件循环
程序常常需要「等着某件事发生」。做法是让代码在循环里反复检查预期事件(例如按钮按下)。
在 Python 里用 while 关键字做循环。它会检查条件是否为 True:若是,就执行循环体(一段缩进的代码);若否,就跳出循环,继续后面的程序。
Python 用缩进表示代码块属于谁。待办列表示例:
购物
修漏水槽
修剪草坪
若再细分,可能写成:
购物:
鸡蛋
培根
番茄
修漏水槽:
向邻居借梯子
找锤子和钉子
还梯子
修剪草坪:
检查池塘边有没有青蛙
检查割草机油量
主任务下面的子任务缩进一层,一眼就能看出从属关系。鸡蛋、培根、番茄 都属于「购物」。
用缩进定义代码块:
from bibo import *
while running_time() < 10000:
display.show(Image.ASLEEP)
display.show(Image.SURPRISED)
running_time 函数返回设备启动以来经过的毫秒数。
while running_time() < 10000: 检查运行时间是否小于 10000 毫秒(10 秒)。若是,就显示 Image.ASLEEP——注意这行缩进在 while 下面,就像待办列表的子项。
若运行时间达到或超过 10 秒,条件为 False,循环结束,程序执行循环后面的 display.show(Image.SURPRISED)。效果就像 micro:bit 先睡 10 秒,再露出惊讶表情。
动手试一下!
处理事件
若要让 BiBoPython 响应按下事件,通常把程序放在无限循环里,用 is_pressed 检查按钮状态。
无限循环很简单:
while True:
# 在这里写要做的事
(while 检查条件是否为 True。True 永远为真,所以循环不会停!)
做一个简单的「电子宠物」:不按 A 就一直难过;按 B 就「结束生命」。(这游戏有点残酷,你可以改成更友好的玩法。)
from bibo 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 某条件为 True:
# 做一件事
elif 另一条件为 True:
# 做另一件事
else:
# 否则做别的事
is_pressed 只返回两种结果:True 或 False。正按着按钮时返回 True,否则 False。上面代码用英语说就是:「永远循环:若按着 A 就显示开心脸;否则若按着 B 就跳出循环;否则显示难过脸。」break 用来跳出循环。
宠物「结束」后,用 display.clear() 清空屏幕。
你能把游戏改得不那么「悲剧」吗?怎样检测同时按下两个按钮?(提示:Python 有 and、or、not 逻辑运算符,可组合多个真/假判断。)