行空板图形化Python入门:从积木编程到代码实战

1. 项目概述:为什么选择行空板作为图形化Python的起点?

如果你对编程感兴趣,尤其是想学Python,但一打开代码编辑器,面对满屏的英文和括号就感到头大,那么“行空板”这个名字你应该记下来。它不是一个普通的开发板,而是一个自带屏幕、预装好完整Python环境的“一体化编程学习终端”。简单来说,它把写代码、运行代码、看结果这三件事,从电脑上搬到了一个巴掌大的小设备上,并且用图形化的方式大大降低了门槛。

我最初接触行空板,是因为想给一些完全没有编程基础的朋友或学生找一个“零挫败感”的入门工具。传统的Python入门,光是搭建环境(安装Python、配置编辑器、处理各种路径问题)就能劝退一半的人。而行空板开箱即用,插上电,屏幕上就是现成的编程界面。更重要的是,它原生支持“图形化积木编程”和“代码编程”的无缝切换。这意味着,你可以像搭乐高一样,用拖拽积木的方式完成一个闪烁LED灯或者显示“Hello World”的程序,然后一键切换到Python代码视图,看看这段逻辑背后对应的真实代码长什么样。这种“所见即所得”和“从图形到代码”的平滑过渡,是它作为入门神器的核心价值。

对于新手而言,最大的障碍往往不是逻辑本身,而是抽象的语法和陌生的环境。行空板通过图形化,把print()if判断、for循环这些概念变成了颜色各异的积木块,把连接硬件(比如控制板载的按钮、屏幕、传感器)的复杂操作简化成了“当按钮被按下时”这样的事件块。你不需要先死记硬背import timetime.sleep(1),你只需要拖一个“等待1秒”的积木。在这个过程中,你实际上已经在无痛学习Python的核心语法和编程思想了。

所以,这个“行空板图形化Python入门”项目,目标非常明确:利用行空板这个硬件载体,通过图形化编程作为脚手架,让初学者绕过初期的环境与语法恐惧,直接体验到编程创造事物的乐趣,并自然过渡到标准的Python代码编写。无论是中小学生、编程爱好者,还是想快速验证想法的创客,这都是一个高效且友好的起点。

2. 行空板核心特性与上手准备

在深入玩法之前,我们得先搞清楚手里这块板子到底能做什么,以及如何让它跑起来。行空板虽然设计初衷是教育,但其硬件配置和软件生态的完整性,远超许多人的预期。

2.1 硬件配置一览:你的微型Python工作站

行空板本质上是一台运行着定制化Linux系统的微型电脑。以市面上常见的型号为例,其核心配置通常包括:

  • 处理器:高性能的多核ARM处理器,足以流畅运行Python程序甚至一些轻量级AI模型。
  • 内存与存储:配备几百MB到1GB不等的运行内存和数GB的eMMC存储,足以安装Python丰富的第三方库。
  • 屏幕:一块2.8英寸或更大的IPS触摸屏,这是它交互的灵魂。你程序的输出可以直接显示在这里,无需外接显示器。
  • 输入设备:除了触摸屏,通常还集成了多个物理按键(A/B键)、麦克风,甚至摇杆,为交互设计提供了多种可能。
  • 丰富接口:板载了LED灯、光线传感器、温度传感器、蜂鸣器、加速度计/陀螺仪等,这意味着你不需要额外焊接或连接任何模块,就能完成声、光、动、感的综合项目。同时,它一定会提供GPIO(通用输入输出)引脚,可以连接更多外部传感器和执行器(如舵机、电机),扩展性极强。
  • 连接能力:Wi-Fi和蓝牙是标配,这让行空板可以轻松联网获取数据,或与其他设备(如手机)通信。

这套配置意味着,你学习的不是“阉割版”的Python,而是一个能控制真实物理世界、能处理网络请求、能进行本地计算的完整Python环境。从点亮一个LED到做一个天气时钟,再到做一个体感游戏,硬件上它都为你准备好了。

2.2 软件环境搭建:五分钟从开箱到编程

这是行空板最省心的地方,几乎没有“搭建”的过程。

  1. 开机与初始化:给行空板连接电源(通常是USB Type-C口),它就会自动开机。首次开机会有一个简单的向导,设置语言、连接Wi-Fi等,跟着屏幕提示点就行。
  2. 进入编程界面:初始化完成后,主屏幕上通常会有一个非常显眼的“编程”或“Mind+”图标。点击它,你就进入了图形化编程环境。这个环境是Web化的,通过浏览器(行空板内置)访问本地的一个服务。这意味着,理论上你也可以从同一局域网内的电脑浏览器访问行空板的IP地址来进行编程,实现“远程开发”。
  3. 认识编程界面:界面主要分为几个区域:
    • 积木区:左侧是分类排列的积木,如“基础”、“循环”、“变量”、“传感器”、“屏幕显示”等。
    • 脚本区:中间是拼接积木的舞台。
    • 代码预览区:通常有一个按钮或标签页,可以实时将你搭好的积木程序转换为Python代码。这是学习的关键!
    • 运行控制区:有“运行”、“停止”按钮,以及程序输出的控制台。

注意:不同版本的行空板固件或配套软件(如Mind+、行空板APP)界面可能略有差异,但核心逻辑和功能分区是一致的。如果遇到界面不同,找到“积木”、“代码”、“运行”这几个核心功能区即可。

2.3 第一个程序:从“Hello World”到“闪烁的灯”

让我们用两个经典例子,快速感受图形化到代码的流程。

项目一:屏幕输出“Hello, Universe!”

  1. 在“基础”或“屏幕”分类下,找到“显示文字”或“打印”积木。
  2. 将其拖到脚本区。积木上可能有一个可编辑的文本框,默认是“Hello!”,我们把它改成“Hello, Universe!”。
  3. 点击右上角的“运行”按钮。你会立即在行空板的屏幕上看到这行文字。

此时,点击“切换到代码视图”。你会看到类似这样的Python代码:

from unihiker import GUI gui = GUI() gui.draw_text(x=120, y=160, text='Hello, Universe!', font_size=20)

看,你刚刚用图形化完成了一次Python库(unihiker)的导入、对象的实例化(gui = GUI())和方法调用(gui.draw_text())。参数x,y控制了文字显示的位置。

项目二:让板载LED灯闪烁

  1. 在“传感器”或“引脚”分类下,找到“设置数字引脚”积木。行空板的LED通常连接在某一个固定的GPIO引脚上(例如引脚P21,具体需查手册)。
  2. 再找到“等待”积木(在“控制”或“基础”里)。
  3. 按照“高电平(亮)-> 等待1秒 -> 低电平(灭)-> 等待1秒”的顺序拼接积木,并放入一个“重复执行”的循环积木中。
  4. 运行。LED灯开始闪烁。

切换到代码视图,你可能会看到:

import time from pinpong.board import Board, Pin Board().begin() led = Pin(21, Pin.OUT) while True: led.write_digital(1) # 高电平,灯亮 time.sleep(1) led.write_digital(0) # 低电平,灯灭 time.sleep(1)

这里你学到了import导入库、while True死循环、time.sleep()延时函数,以及控制引脚输出的方法。图形化帮你理清了逻辑顺序,代码则展示了具体的语法实现。

3. 图形化编程的核心积木与Python语法映射

图形化编程不是玩具,它的每一个积木块都对应着Python中一个或多个核心语法概念。理解这种映射关系,是你从“拖拽”走向“书写”的关键。

3.1 程序结构与逻辑控制

这是编程的骨架,在图形化中通常由特定形状的积木体现。

  • 顺序执行:最简单,就是从上到下拼接积木。对应代码的自然书写顺序。
  • 条件判断(if/elif/else):图形化中是一个“如果...那么...”的C型缺口积木。你可以把条件积木(比如“按键A被按下?”)塞进缺口,在“那么”后面拼接满足条件时要执行的积木。如果需要“否则”,可以添加“否则”分支。
    • Python映射:直接对应if:elif:else:语句。图形化帮你正确组织了缩进。
  • 循环(for/while)
    • 重复执行/无限循环:对应while True:。一个“C”型或“帽子型”积木,把要重复的积木包在里面。
    • 计次循环:对应for i in range(n):。你需要设置循环次数,循环变量i在图形化中通常可以直接用在被包裹的积木里。
    • 条件循环:对应while 条件:。比如“当温度>30时重复执行”,图形化会提供一个可填入条件表达式的循环积木。
  • 事件驱动:这是图形化和交互编程的精华。例如“当开机时”、“当按钮A被按下时”、“当屏幕被触摸时”。这些积木像一个个独立的程序入口。
    • Python映射:这通常对应着底层框架(如unihiker库)的事件监听机制。在代码中,你会看到类似gui.on_click(event_handler_function)这样的函数注册。图形化帮你隐藏了回调函数定义的复杂性。

3.2 数据与运算:变量、列表与运算符

  • 变量:图形化中你会找到“设置变量为...”和“改变变量...值”的积木。你可以给变量命名(如score),并赋值。
    • Python映射:直接对应变量名 = 值。图形化中的“改变变量”对应代码中的score = score + 1
    • 实操心得:在图形化中养成给变量起有意义名字的习惯(如player_score而非a),这个好习惯会直接延续到代码编写中。
  • 列表(数组):有“创建列表”、“向列表添加项”、“获取列表第...项”等积木。你可以直观地看到列表的结构。
    • Python映射:对应my_list = [],my_list.append(item),my_list[0]等操作。
  • 运算符:加减乘除、比较(大于、等于)、逻辑(且、或、非)都有对应的积木块。你需要把要计算的变量或数值填进积木的插槽里。
    • Python映射+,-,*,/,>,==,and,or,not。图形化帮你避免了拼写错误。

3.3 函数与模块化:让程序更清晰

当一段积木逻辑被反复使用时,就该用到“函数”了。

  • 定义函数:图形化中你可以“创建一个函数”,给它起名(如calculate_average),并可以添加“参数”。然后像拼普通积木一样,在函数定义体内拼接逻辑。
  • 调用函数:之后,你就会在积木区看到一个以你函数名命名的积木块,可以像使用内置积木一样使用它。
  • Python映射:这完美对应了def calculate_average(numbers):的函数定义。图形化帮你明确了函数名、参数和函数体的结构,是理解代码模块化思想的绝佳方式。

重要提示:在图形化中完成一个复杂功能后,一定要切换到代码视图反复对照。看看你拼接的“当按钮按下”在代码里是如何用def on_button_a()button_a.irq()实现的;看看你用的“列表长度”积木对应代码里的len()函数。这个过程就是最有效的语法学习。

4. 结合硬件的综合项目实战

掌握了基本积木后,我们就可以利用行空板丰富的板载资源,做一些有趣的项目了。这些项目能让你立刻感受到编程控制物理世界的成就感。

4.1 项目一:环境光线监测仪

这个项目利用板载光线传感器,实时检测环境光强度,并在屏幕上动态显示。

图形化实现步骤:

  1. 初始化:使用“当开机时”积木作为程序起点。
  2. 创建变量:创建一个变量,命名为light_value,用于存储光线值。
  3. 主循环:拖入一个“重复执行”积木。
  4. 读取传感器:在循环内,从“传感器”分类找到“读取光线传感器”积木,将其值“赋值给”变量light_value
  5. 屏幕显示:使用“清空屏幕”积木(避免文字重叠),然后使用“显示文字”积木,将文字内容设置为类似“光线值:”和light_value变量拼接起来(图形化中通常有“连接...和...”的文本积木)。
  6. 添加延时:在循环末尾加入“等待0.2秒”积木,避免刷新太快看不清。

切换到代码视图,核心部分可能如下:

import time from unihiker import GUI from pinpong.board import Board, Pin Board().begin() gui = GUI() light_sensor = Pin(34, Pin.ANALOG) # 假设光线传感器接在34脚 while True: light_value = light_sensor.read_analog() # 读取模拟值 gui.clear() # 清屏 gui.draw_text(x=100, y=120, text=f"光线值:{light_value}", font_size=18) time.sleep(0.2)

经验技巧:光线传感器读取的是模拟值(比如0-4095),你可以通过映射将其转换为更直观的百分比或勒克斯单位。在图形化中,可以使用“映射”数学积木;在代码中,就是percent = (light_value / 4095) * 100

4.2 项目二:简易加速度计平衡球游戏

利用板载的加速度计,我们可以制作一个通过倾斜板子来控制小球移动,避免掉入陷阱的小游戏。

图形化设计思路:

  1. 游戏初始化:“当开机时”设置游戏背景、绘制一个代表小球的圆形、绘制几个静态的“陷阱”洞。
  2. 创建变量:为小球创建ball_xball_y变量记录其屏幕坐标。为加速度值创建acc_x,acc_y变量。
  3. 游戏主循环
    • 读取加速度:在循环内,读取加速度计的X和Y轴值,存入变量。
    • 更新球位置:根据acc_xacc_y的值(需适当缩放和取反,因为倾斜方向与屏幕移动方向可能相反),改变ball_xball_y的值。公式类似ball_x = ball_x + acc_x * 0.1
    • 边界检测:判断ball_xball_y是否超出屏幕范围,如果超出则重置到边界或判定游戏结束。
    • 碰撞检测:判断小球当前位置是否与任何一个“陷阱”洞的位置重叠(计算距离),如果重叠,则游戏结束,显示“Game Over”。
    • 重绘:清屏,重新绘制背景、陷阱,并根据新的ball_x,ball_y绘制小球。
    • 短暂延时:等待约0.03秒,控制游戏帧率。

代码层面的关键点:

# 伪代码示例,展示核心逻辑 while game_active: # 读取加速度 acc_x, acc_y = accelerometer.get_values() # 更新位置(带系数和边界限制) ball_x += acc_x * sensitivity ball_x = max(0, min(screen_width, ball_x)) ball_y += acc_y * sensitivity ball_y = max(0, min(screen_height, ball_y)) # 碰撞检测 for hole in holes: if distance(ball_x, ball_y, hole.x, hole.y) < hole.radius: game_active = False break # 重绘 redraw_all() time.sleep(0.03)

这个项目综合运用了变量、循环、条件判断、事件(循环本身作为驱动)、数学运算,并引入了简单的游戏逻辑。在图形化中实现它,你需要耐心地拼接和调试各个逻辑块。完成后再看代码,你会对游戏循环(Game Loop)和状态管理有深刻的理解。

4.3 项目三:物联网雏形——网络天气时钟

利用行空板的Wi-Fi能力,我们可以让它从互联网获取数据,做一个显示天气和时间的桌面时钟。

图形化实现流程:

  1. 连接Wi-Fi:使用“网络”分类下的“连接Wi-Fi”积木,填入你的SSID和密码。通常需要放在“当开机时”并等待连接成功。
  2. 获取网络时间:连接成功后,使用“获取网络时间”积木,可以得到一个包含年、月、日、时、分、秒的数据结构。
  3. 获取天气数据:使用“HTTP请求”积木,向一个免费的天气API(如和风天气、OpenWeatherMap的免费接口)发送GET请求。你需要提前申请API Key,并按照API文档拼接请求URL。
  4. 解析数据:HTTP请求返回的是JSON格式的文本。使用“解析JSON”积木,可以将其转换为可操作的数据,然后像取变量一样,取出temperature(温度)、weather(天气状况)等字段。
  5. 显示与刷新:将时间和天气信息拼接成好看的字符串,用“显示文字”展示在屏幕上。使用一个循环,每隔一段时间(如10分钟)重新获取一次天气,时间则每秒或每分钟更新一次。

代码视角的关键技术:

import network import time import json import urequests from unihiker import GUI # 1. 连接Wi-Fi wlan = network.WLAN(network.STA_IF) wlan.active(True) wlan.connect('你的Wi-Fi名', '密码') while not wlan.isconnected(): time.sleep(0.5) # 2. 获取时间(示例,实际可能需要更复杂的NTP请求) # 行空板库可能已封装,如 rtc.settime('ntp') # 3. 获取并解析天气 api_url = "http://api.openweathermap.org/data/2.5/weather?q=Beijing&appid=你的KEY&units=metric" response = urequests.get(api_url) weather_data = json.loads(response.text) temperature = weather_data['main']['temp'] description = weather_data['weather'][0]['description'] # 4. 显示 gui = GUI() while True: current_time = get_formatted_time() # 自定义时间格式化函数 display_text = f"{current_time}\nTemp: {temperature}°C\n{description}" gui.clear() gui.draw_text(x=60, y=100, text=display_text, font_size=16) time.sleep(60) # 每分钟更新一次

这个项目引入了网络请求、JSON数据解析等现代编程中极其常见的概念。图形化积木帮你处理了urequestsjson库的部分细节,让你专注于逻辑流程。通过这个项目,你会理解什么是API,什么是数据交换格式。

5. 从图形化到纯代码的平滑过渡策略

图形化是优秀的起点,但我们的目标是独立编写Python代码。如何实现平稳过渡?以下是我实践下来最有效的策略。

5.1 对照学习法:每个图形化项目都生成代码

这是最基本也最有效的方法。完成任何一个图形化项目后,无论多简单,都立刻点击“查看代码”或“切换到Python模式”。

  1. 逐行对照:找到图形化积木块在代码中对应的行。例如,你拖的“如果...那么”积木,在代码里就是if:开头的几行,注意看它的缩进。
  2. 理解映射:重点理解:
    • 积木的“缺口”和“凸起”如何对应代码的缩进和代码块结构
    • 积木的“参数输入框”如何变成函数的参数
    • 变量操作积木如何变成赋值语句
    • 事件积木背后是怎样的函数定义和注册机制
  3. 手动模仿:不要只是看。关掉图形化界面,尝试在行空板的代码编辑器或通过电脑SSH连接,凭记忆重新键入这个项目的代码。遇到卡壳再回去看。

5.2 混合编程模式:在代码中调用图形化模块

行空板的编程环境通常允许“混合模式”。你可以在代码编辑器中,直接导入图形化积木对应的Python库(如unihiker,pinpong),并调用它们。

  1. 从复制粘贴开始:将图形化生成的代码全部复制到纯代码编辑器中,运行确保成功。
  2. 尝试修改:在复制的代码基础上进行小修改。比如,把闪烁LED的频率从1秒改成0.5秒;把显示的文字换个颜色或位置。
  3. 添加纯代码逻辑:在现有框架内,添加一些图形化里没有直接对应积木的纯Python逻辑。例如,在灯光闪烁的程序里,添加一个计数器变量,闪烁10次后自动停止。这需要你写count = 0,在循环里写count += 1,以及if count >= 10: break
  4. 替换部分图形化逻辑:尝试将一小段用积木实现的逻辑,用你自己写的纯代码函数替换。例如,原本用“映射”积木处理传感器数据,现在自己写一个def map_value(x, in_min, in_max, out_min, out_max):的函数来实现。

5.3 挑战“无积木”项目:从模仿到创造

当你对基本语法和库函数有一定熟悉度后,可以开始尝试完全不打开图形化界面。

  1. 复刻经典:找一些之前用图形化做过的成功项目,如“光线监测仪”,这次完全在代码编辑器里从头开始写。参考官方文档或库的示例代码。
  2. 微创新:在复刻的基础上增加新功能。比如,给光线监测仪加上一个功能:当光线低于某个阈值时,让蜂鸣器响一声,同时屏幕显示“太暗了!”。
  3. 探索新库:行空板基于Linux,可以安装几乎任何兼容ARM架构的Python库。尝试用pip install安装一个图形化里没有的库,比如requests(如果内置的urequests功能不够)、PIL(图像处理),然后根据该库的文档写一个小demo。
  4. 项目驱动:给自己设定一个全新的小项目目标,比如“用行空板做一个番茄钟”,然后完全用代码实现。在这个过程中,你会大量查阅文档、搜索错误信息、调试代码,这是成长为独立开发者的必经之路。

避坑指南:在过渡期,最常见的困惑是“我知道图形化里该拖哪个积木,但不知道代码怎么写”。这时,善用图形化生成的代码作为“字典”。当你需要实现某个功能时,先在图形化里粗略拖出那个功能的积木块,然后立刻看生成的代码,学习它的写法,再回到你的纯代码项目中使用。这不是作弊,而是高效的学习工具。

6. 常见问题与深度调试技巧

即使有图形化辅助,在学习和项目制作中依然会遇到各种问题。这里记录一些典型问题和我积累的排查经验。

6.1 图形化编程常见问题

  1. 积木拼接不上

    • 原因:积木的形状(缺口和凸起)决定了它们只能以语法正确的方式连接。例如,一个条件判断积木的缺口只能嵌入布尔类型(真/假)的积木。
    • 解决:仔细看积木的颜色和形状提示。将鼠标悬停在积木上,有时会有提示信息。确保你填入的是正确类型的值(比如数字、文本、布尔值)。
  2. 程序运行没反应或立即结束

    • 原因:最常见的是缺少“事件”驱动或主循环。如果你的程序只是一些顺序执行的积木(比如设置变量、显示文字),而没有放在“当开机时”或“重复执行”里,那么它可能在启动瞬间就执行完毕了。
    • 解决:检查你的核心逻辑是否被一个“事件积木”(如“当开机时”)或“循环积木”包裹。对于需要持续运行的程序(如游戏、监测仪),必须使用“重复执行”。
  3. 屏幕显示混乱,文字图片重叠

    • 原因:每次更新屏幕显示前,没有清空上一帧的内容。
    • 解决:在绘制新内容之前,先执行一次“清空屏幕”或“填充背景色”操作。
  4. 传感器读数不稳定或异常

    • 原因:可能是硬件接触问题、环境干扰,或者程序读取太快。
    • 解决
      • 软件去抖:对于按钮,在读取状态后加一个短暂的延时(如0.05秒)再读一次,确认状态稳定。
      • 数据滤波:对于模拟传感器(如光线、温度),可以连续读取多次(比如10次),然后取平均值作为最终结果。这在图形化中可以用“变量”和“循环”配合实现。
      • 检查硬件:确认行空板供电稳定,传感器引脚连接正确(如果是外接传感器)。

6.2 代码编程与混合模式下的调试

当你开始写更多代码时,调试能力就变得至关重要。

  1. 语法错误(SyntaxError)

    • 表现:程序完全无法运行,控制台会报错并指出错误行。
    • 常见原因:缺少冒号:、缩进不一致、括号或引号不匹配、错误的关键字拼写。
    • 排查:仔细阅读错误信息,它通常会精准定位到行。重点检查报错行及其上一行。使用代码编辑器的语法高亮功能有助于发现不匹配的引号或括号。
  2. 运行时错误(NameError, TypeError等)

    • 表现:程序能启动,但在执行到某处时崩溃报错。
    • NameError:通常是变量或函数名拼写错误,或者在使用前未定义。
    • TypeError:通常是函数参数类型不对,或者对不支持该操作的数据类型进行了操作(如用+连接字符串和整数)。
    • 排查:使用print()大法!在怀疑有问题的变量前后打印它的值和类型。例如:print("变量a的值是:", a, "类型是:", type(a))。这是嵌入式开发和Python调试中最朴素但最有效的方法。
  3. 逻辑错误(程序运行不对,但不报错)

    • 表现:程序能跑,但结果不符合预期。比如LED该亮不亮,计算结果是错的。
    • 排查
      • 分段注释:将部分代码用#注释掉,逐步缩小问题范围。
      • 添加日志:在关键的分支、循环开始和结束时打印状态信息。例如在if语句里打印print("进入条件分支,当前值为:", value)
      • 检查条件:仔细核对所有ifwhile的条件表达式,特别是==(等于)误写成=(赋值)这种经典错误。
  4. 外设或库相关错误

    • 表现:导入库失败,或调用硬件相关函数时报错。
    • 排查
      • 确认库是否存在:在行空板的终端里尝试import该库。
      • 检查引脚号:硬件操作错误大部分是引脚号弄错了。对照行空板的引脚定义图,确认你代码里使用的引脚编号(如Pin(21))对应的是正确的物理引脚和功能(是数字输出?还是模拟输入?)。
      • 查阅文档:行空板相关的unihikerpinpong等库,都有详细的API文档。遇到函数用法不清楚,第一时间查文档。

6.3 性能优化与资源管理

当项目变得复杂时,需要注意资源使用。

  • 避免死循环阻塞:在while True的主循环中,如果有一个耗时很长的操作(如一个复杂的计算或网络请求),会导致整个程序“卡住”,无法响应其他事件(如按钮按下)。解决方案是尽量将耗时操作拆解,或者使用异步编程的思路(对于进阶者)。
  • 管理屏幕刷新:频繁地清屏和重绘所有元素(尤其在循环中)会消耗大量资源。如果只是更新部分文字,可以考虑使用专门更新文本的函数(如果库提供),而不是每次都清空整个屏幕再重画。
  • 注意内存:虽然行空板内存不算小,但在处理大量数据(如图像、长列表)时仍需注意。及时删除不再需要的大变量(del big_list),或者使用生成器而非列表来遍历大数据集。

从图形化拖拽到独立编写代码,这个过程中犯错是常态。关键是把每一个错误信息都当成学习的机会,耐心地使用print()、分段测试、查阅文档这三个基本方法去解决它。每一次成功的调试,都会让你对程序运行机制的理解加深一层。行空板提供了一个容错率很高的实验环境,大胆尝试,耐心调试,你会发现自己不知不觉中已经跨越了从图形化到代码编程的鸿沟。