1. 文档中心
  2. 比卜创造 Micro:bit
  3. Python
  4. 按钮

按钮

到目前为止,我们写的程序主要是让 micro:bit 做些什么——这叫输出。但设备也需要感知外界变化,这些被感知的东西叫输入。

很好记:输出是设备向外界「放出去」的东西;输入是进入设备、等待程序处理的东西。

micro:bit 上最明显的输入就是两个按钮,标为 A 和 B。我们需要让 BiBoPython 对按钮按下做出反应。

统计按键次数

这非常简单:

from bibo import *

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

这段程序先休眠 10000 毫秒(即 10 秒),然后在屏幕上滚动显示你按下按钮 A 的次数。就这些!

虽然功能很「没用」,但引入了两个新概念:

  1. sleep 函数会让 micro:bit 暂停指定毫秒数。想在程序里加停顿,就用它。函数和方法类似,但不通过 . 挂在某个对象上。
  2. 有一个叫 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 逻辑运算符,可组合多个真/假判断。)