刚开始接触树莓派的时候,系统桌面里就已经躺着 Thonny IDE 这个图标了。那会儿我的注意力全在怎么烧系统、怎么接屏幕、怎么让风扇安静下来,真没把 Thonny 当回事,总觉得写 Python 应该用更“专业”的编辑器。结果折腾了小半个月,试过 vim、IDLE,甚至一度想装 VSCode,最后又老老实实回到 Thonny 上来。
今天这篇就专门聊聊 Thonny 的窗口——它到底能干什么、怎么用、有哪些实操技巧和坑。不管你是刚拆开树莓派包装的小白,还是已经在做小车、传感器、摄像头项目但没把 Thonny 摸透的初级玩家,这篇文章都应该有点参考价值。毕竟树莓派官方系统预装 Thonny 不是偶然,它就是一个为“在树莓派上快速写出能跑的 Python 程序”而设计的工具。
1. 为什么树莓派官方系统默认装 Thonny
1.1 树莓派缺的不是编辑器,而是一个“能跑起来看状态”的环境
很多人入手树莓派后,很容易把重心放在“装系统”“配网络”“接显示器”这些环节上,真正到了打开桌面准备写代码的时候,反而愣住了:到底用哪个编辑器?我当时的第一个选择是 vim,觉得既然玩 Linux 就应该用终端式编辑,结果折腾了半天,连“插入模式”“普通模式”都记不住,更别说调试 Python 了。后来试过 IDLE,这个 Python 自带的极简 IDE 界面太简陋,报错信息对新手不友好,调字体还容易错位。最后稳定下来,还是回到系统自带的 Thonny 上。
Thonny 这个名称源于北欧的一种针叶树,设计初衷是面向编程教学打造的一款 Python IDE。树莓派官方把 Thonny 直接预装进 Raspberry Pi OS,和树莓派“面向教育、低门槛造物”的基因非常匹配。树莓派最经典的玩法是接几个传感器、控制几台电机、点亮几颗 LED,这些场景背后全是 Python。Thonny 要解决的不只是“把代码敲上去”,而是“让代码运行时你能看得见内部发生了什么”。
我见过不少朋友用其他编辑器写了一堆代码,最后运行报错只能对着终端瞪眼。Thonny 的价值恰恰就在这里:它把 Python 解释器的状态、变量的实时值、调用栈的执行位置,全部可视化地放到同一个窗口里。你可以一边跑程序,一边看变量变化,这是它区别于普通文本编辑器的真正杀手锏。
1.2 和 IDLE、vim、VSCode 比,Thonny 到底赢在哪
先说 IDLE。IDLE 是 Python 官方自带的极简 IDE,界面类似一个空壳:一个编辑窗口、一个 Shell 窗口,调试功能只有简单的单步。对于用树莓派接传感器、做小车的新手来说,每次查变量值都得手写 print,每次循环出错就得手动加断点观察,效率很低。而且 IDLE 的字体渲染在树莓派屏幕分辨率不高时容易错位,行号和代码挤在一起,体验一般。
再说 vim。vim 本身没有图形界面,要在终端里靠快捷键操作,写代码时你还得记一堆模式切换。对于写 Python,特别是入门阶段,语法缩进都还不熟练,用 vim 就是自己给自己上强度。有的教程推荐终端加 nano,nano 比 vim 友好一点,但还是没有可视化调试,也无法直接看变量。
VSCode 是另一个极端:功能非常强大,但第一次配置就要装 Python 扩展、REPL、终端集成,还需要理解 launch.json、tasks.json 那一套。在树莓派的内存和 CPU 资源下,VSCode 跑起来并不轻快。我自己在树莓派 4B 上装过 VSCode,打开一个文件要转半天圈,操作起来明显有迟滞感。树莓派这种低成本的准嵌入式 Linux 板卡,真没必要给它配上桌面上那套重型 IDE。
Thonny 恰好卡在中间:比 IDLE 完整,比 vim 友好,比 VSCode 轻快。它自带 Python 解释器检测,不需要手动配置环境变量,打开就能运行;自带断点调试,单步执行时编辑器高亮当前行;自带变量视图,不写 print 也能观察每个变量的变化。我用 Thonny 最大的感受是,它不是一个“写代码的工具”,而是一个“把代码运行状态说清楚的窗口”。
| 编辑器 | 可视化调试 | 变量实时观察 | 新手友好度 | 树莓派上的资源占用 |
|---|---|---|---|---|
| Thonny | 有 | 有 | 高 | 轻量 |
| IDLE | 简单单步 | 无 | 中 | 轻 |
| vim | 无 | 无 | 低 | 极轻 |
| VSCode | 插件化 | 插件化 | 中 | 较重 |
2. 第一次打开 Thonny:窗口里每一块都能干什么
2.1 顶部菜单和工具栏
在 Raspberry Pi OS 上打开 Thonny 很简单:点击桌面左上角的树莓菜单,在 Programming 子菜单里找到 Thonny Python IDE,单击就能启动。也可以右键选择 Add to Favorites 固定到任务栏,以后点一下就能打开。
进入之后,窗口主要分为四块:最上方的菜单栏与工具栏,中间的编辑器区域,下方的 Shell 区域,以及左侧可以展开的变量和文件视图。很多人初次打开会觉得“左边这列是什么”“下面这个黑框是干嘛的”,别急,顺着从上到下说明。
菜单栏里,“工具”菜单最值得研究。尤其是“Open system shell”,点击后会弹出一个底部的终端标签页,这是真正的系统 Shell,可以在这上面执行 pip 安装、查看网络状态、跑其他命令行工具。很多教程让你另外开一个终端窗口,其实你完全可以在 Thonny 内部完成这些操作,不用切来切去。
工具栏上最重要的是几个运行相关按钮:绿色的“运行当前脚本”(F5)、蓝色的“调试当前脚本”(Ctrl+F5)、还有“重启后端进程”(Ctrl+F2)。这里要先理解一个概念:Thonny 每次运行脚本,都会启动一个独立的 Python 解释器后端进程,你点击“停止/重启”,本质就是杀掉这个后端进程再重新启动。当你的程序卡死在死循环里,或者不小心占用了 GPIO 设备,别犹豫,直接按 Ctrl+F2 重启后端,整个 Python 环境会回到干净状态。
2.2 编辑器区域
编辑器区域就是写代码的地方,但它有几个默认行为值得注意。
第一是自动保存。Thonny 默认会在运行前自动保存当前文件,这个机制很方便,但也有一些反直觉的地方:如果文件还没有取名字,运行时会要求你先保存;如果改到一半想直接测试,它会先保存再运行。我有一次临时把代码改坏又按了 F5,结果保存下来的也是坏代码,幸好有备份习惯。建议在运行长代码前确认无误,或者先把文件另存为副本。
第二是语法高亮与自动缩进。Thonny 对 Python 缩进的识别很严格,连 Tab 和空格混用都会被区分。Python 的缩进代表代码块层级,Thonny 把它强制严格化,反而帮新手避开了很多麻烦。唯一坑人的是:从别处复制代码时,如果前后行的空格数量不一致,一运行就是 IndentationError。这个后面在常见问题里专门说。
第三是注释/取消注释快捷键:Ctrl+1 注释,Ctrl+2 取消注释。工具栏里也有对应图标,但这种高频操作,记快捷键比每次点图标快得多。如果你在做树莓派摄像头、小车这类项目时经常需要临时屏蔽几行调试代码,这个快捷键几乎是每天都要用的。
2.3 Shell 区域
Shell 区域是 Thonny 窗口下半部分,也叫 Python Shell,它承担两种职责:一是程序运行时 print 出来的输出会显示在这里;二是这个区域本身就是一个交互式 Python 解释器,你可以直接在“>>>”之后输入一行 Python 语句并回车执行,在摸清“这个库这个函数大概怎么回事”的时候特别高效。
我第一次用 Thonny 跑 GPIO 控制程序时,就是先在这里执行:
import RPi.GPIO as GPIO GPIO.setmode(GPIO.BCM)确认导入和模式设置没报错,再回头写进编辑器里。这种“先在 Shell 试,再写正式代码”的工作流,我强烈推荐给所有树莓派初学者,它能把“思考”和“动手”分开,减少反复运行整个脚本的时间。
Shell 区域还可以在脚本执行结束后,继续与函数、变量互动。比如你跑完一个 led_blink.py 脚本,如果脚本里定义了 led_control(1) 这样的函数,你还可以在 Shell 里输入 led_control(0) 再次调用它,不用重新运行整个文件。前提是脚本执行完毕后后端进程没有被关掉,所以不要一结束就按 Ctrl+F2。
2.4 变量和文件视图
Thonny 窗口默认左侧有一系列视图标签页,最常用的是 Variables 和 Files。
Variables 变量视图会实时显示当前作用域里的变量名和值。这个功能在调试、排查逻辑错误时极其有用,因为你不必在每个循环里手动 print。比如写一个计数循环,单步执行时,左侧变量视图里的 i 每跑一次就更新一次,一眼就能看出逻辑错在哪。
Files 文件视图则是一个简易文件管理器,会显示当前项目文件夹,双击其他目录里的文件可以直接打开编辑。有人会把树莓派上的项目文件统一放在 /home/pi/Projects 里,然后在 Files 视图中导航过去,非常方便。如果你是做摄像头、传感器这类多文件项目,用 Files 视图来切换脚本比每次从菜单打开要顺滑得多。
3. 树莓派场景下的核心实操:从环境变量到 GPIO 控制
3.1 解释器选择:让 Thonny 认识你的 Python 环境
Thonny 默认自带一个内置 Python 解释器,但这个内置解释器和我们平时在终端里用的系统 Python 并不完全一致。做树莓派开发时,我更建议把 Thonny 的解释器切换成系统解释器,这样才能直接使用系统下已安装的库,比如 RPi.GPIO、picamera、opencv 等等。
操作路径:菜单栏点击“工具”→ Options → Interpreter 选项卡,在这里选择以 /usr/bin/python3 开头的那个系统解释器,或者把路径指定到其他需要的解释器。如果选的是“Thonny interpreter”,它会用 Thonny 内置的隔离环境,pip 装的东西不在同一个环境里,之后很可能出现“我在终端里 pip 安装成功了,但在 Thonny 里 import 却报 ModuleNotFoundError”的诡异情况。这个坑几乎所有人都踩过。
我分享一个自己的教训:有段时间我在树莓派上跑 OpenCV 的人脸检测,终端里可以 import cv2,但 Thonny 里一运行就报 No module named 'cv2'。最后才明白是内置解释器隔离导致。切换回系统解释器后,所有依赖瞬间就通了。如果你也遇到这种问题,先别急着装库,去 Options 里看看解释器选的是哪一个。树莓派上常见的人脸识别、小车避障、智能家居控制,其实都建立在“Thonny 能用对解释器、能装对包”这个基础之上。
3.2 第一个能跑的 GPIO 小程序
树莓派上学习硬件控制,最经典的第一课就是点亮 LED,一定要自己实际接一次电路,再写代码跑通。这里我用 BCM 编号的通用写法:
import RPi.GPIO as GPIO import time LED_PIN = 18 GPIO.setmode(GPIO.BCM) GPIO.setwarnings(False) GPIO.setup(LED_PIN, GPIO.OUT) while True: GPIO.output(LED_PIN, GPIO.HIGH) print("LED ON") time.sleep(0.5) GPIO.output(LED_PIN, GPIO.LOW) print("LED OFF") time.sleep(0.5)这段代码的作用是让接在物理引脚 12 号(BCM 编号 18)上的 LED 以 0.5 秒为周期闪烁。注意我说的是 BCM 编号,而不是物理引脚号。树莓派 GPIO 编号有两种逻辑:一种是 BOARD 模式,按物理引脚位置 1 到 40 编号;另一种是 BCM 模式,按 Broadcom 芯片的 GPIO 口编号。新手最大的困惑之一就是“我该用哪个编号”,我的建议是统一用 BCM 模式,因为大多数教程和示例代码都用 BCM,接口也更直观。
在 Thonny 里运行这段代码的过程是:保存文件(例如 led_blink.py)→ 点击“运行当前脚本”或按 F5 → 观察 Shell 里的输出和 LED 的实际状态。运行后程序会进入死循环,你有几个停止它的方式:点击 Shell 上方的“停止”红色按钮,菜单“运行”里的“停止/重启后端进程”,或者直接快捷键 Ctrl+F2。当后端被重启时,GPIO 引脚也会被释放,硬件信号停止。
这里还有一个细节:RPi.GPIO 默认可能抛出警告,比如引脚已经被占用时会出现“This channel is already in use”提示。代码里的 GPIO.setwarnings(False) 就是关闭这类提示。但关闭提示不代表忽略冲突,如果你在脚本里同时用了两个进程控制同一个引脚,还是要自己统筹好。
3.3 权限问题:为什么 GPIO 一运行就报错
树莓派上 GPIO 操作需要访问 /dev/gpiomem 设备,这个设备文件的权限默认属于 gpio 用户组。如果当前用户不在 gpio 组里,运行时就会报类似“RuntimeError: No access to /dev/gpiomem. Try running with sudo”的错误。Raspberry Pi OS 默认把 pi 用户放进了 gpio 组,一般情况下不会有问题;但如果你用 Thonny 时发现 GPIO 程序总报权限错误,第一反应应该是检查当前用户是否在 gpio 组,或者有没有用 sudo 方式启动 Thonny。
我不建议为了省事直接 sudo Thonny,因为 sudo 会让整个 IDE 以 root 身份运行,文件归属和权限会混乱,一旦不小心改了系统文件会留隐患。更好的办法是把当前用户加进 gpio 组,在终端执行“sudo usermod -aG gpio $USER”后重新登录。如果只是应急测试,也可以在 Thonny 里放弃 RPi.GPIO,改用更底层的 sysfs 方式读写,但那个确实不推荐给新手。
还有一个容易忽略的点:当程序没有结束时强行拔掉传感器或 GPIO 杜邦线,再运行新脚本时,某些库会提示“non-root cannot access /dev/mem”这类信息。这通常是内核驱动没有完全释放设备,或者旧进程还在占用。最可靠的办法不是反复调代码,而是停止后端进程、关闭 Thonny,然后重新插拔 GPIO 接线后,再按 Ctrl+F2 重启后端。
4. 调试和变量观察:Thonny 的隐藏战力
4.1 断点和单步:跟找 bug 一样跟代码
Thonny 的调试功能对新手来说非常友好,它比在代码里塞一堆 print 要高效得多。调试的主要入口是工具栏上的蓝色“调试当前脚本”按钮,或者快捷键 Ctrl+F5。
按下后会进入调试模式,你会发现编辑器左侧出现黄色、绿色高亮行,当前正在执行的位置会用绿色背景标出。工具栏多出几个控制按钮:F7 单步进入、F8 单步跳过、F9 继续运行。我建议你现在就写一个带循环和函数的小程序,用 F7 和 F8 来回走几遍,马上就能理解代码内部执行流程和函数调用的顺序。
实际调试树莓派 GPIO 程序时,有一点要特别注意:别尝试在 time.sleep() 这样的延时函数内部进行单步,那会让调试体验变得非常糟糕,因为 sleep 的底层依然是时间等待,单步很难跨过去。通常的做法是在 sleep 前后各设一个断点,然后按 F9 继续运行,等它执行到断点处再单步观察。
断点的设置方法是:在编辑器行号区域单击,会出现一个红色圆点,运行调试时会暂停在该行。如果你需要条件断点,可以先设普通断点,再右键断点设置“条件”,输入一个表达式,比如 i == 5,只有条件成立时才会停。这在排查特定循环次数处的异常时很实用。
4.2 变量视图:不写 print 也能看内部状态
前面提过变量视图,这里展开说一下。在树莓派做传感器数据采集时,我经常要验证“温度传感器读上来的整数除 10 是多少度”,如果写成 print 也能看,但每次改动都要重新运行一遍脚本。用变量视图和断点配合,你就能在程序运行的任意时刻观察到所有变量当前的值,包括列表、字典的内容。
我自己的一个习惯是:在关键逻辑出现的前一行设断点,然后运行调试,在左侧变量视图里把每个变量的初值、类型、可能的问题都看一遍。确认无误后再继续执行,这样排错的过程非常清晰。变量视图对字典和列表的展示也比较直接,虽然没有桌面 IDE 那么强大,但对于树莓派这种轻量环境完全够用。
使用时注意“作用域”概念:变量视图只显示当前作用域可见的变量。在函数内部单步时,你会看到局部变量;回到主程序区域时,才会看到全局变量。如果你要在函数内部看全局变量,可以用 global 声明,但这会涉及 Python 作用域规则的细节,这里不继续展开。
4.3 用 Thonny 安装第三方库:新手最稳的 pip 通道
树莓派上装 Python 库最常见的方式是终端 pip,但很多新手对终端环境不熟悉,装来装去都不知道装到哪去了。Thonny 提供了一个图形化的包管理入口:点击“工具”菜单 → Manage packages,打开一个简单的搜索安装界面。
界面顶部有个搜索框,输入库名称,比如 RPi.GPIO、picamera、opencv-python,点击搜索后会出现结果列表,选中后点击 Install 即可安装。安装过程中下方会输出日志,出现类似 Successfully installed 的字样就代表成功。安装来源默认是 PyPI 官方源,如果网络状况一般,可以在 Options 里修改“Python package mirror”为国内镜像地址。
但这里最关键的还是回到解释器选择:如果你没有把解释器切到系统解释器,那么用 Thonny 的 Manage packages 安装的包,会装进 Thonny 的内置环境里。切回系统解释器后,这些包又不在了。所以“想清楚我要用哪个环境”这句话,比记任何 pip 命令都重要。我现在习惯是从一开始就切到系统解释器,之后在终端和 Thonny 里看到的是同一个环境,再也不会出现“终端能用、Thonny 不能用”的问题。
5. 常见问题速查:我在树莓派上踩过的 Thonny 坑
5.1 运行脚本后 Shell 里没有任何输出
这种情况一般有三种可能。
第一种是代码里只有函数定义,没有主动调用函数。Thonny 运行完脚本后,只是把函数放入内存,并不会自动执行,只有显式调用才会产生输出。
第二种是输出被缓冲了。在树莓派上,print 的内容可能不会立刻刷新到 Shell,需要代码执行到退出或再次遇到 print 时才批量显示,这在循环里比较常见。你可以在 print 中加入 flush=True,比如 print("...", flush=True),强制刷新。
第三种是你点错了运行按钮。在 Thonny 里,如果焦点不在编辑器,而是选中了 Shell 中的某一段,按 F5 运行的可能不是你想运行的文件。确保编辑器打开的是目标文件,并把焦点放在编辑器里再运行。
5.2 提示 ModuleNotFoundError,但终端 pip 明明装过
这个问题在树莓派上极其常见。核心原因除了我前面提到的解释器隔离,还有一个是 pip 指向的问题。很多教程会让你用 pip install 装库,但树莓派系统可能同时存在 pip、pip3、python3 -m pip 等不同入口,装到的目录不一致。最稳妥的检查方法是在 Thonny 的 Shell 里执行:
import sys print(sys.executable)看到当前解释器路径,再去终端执行同样的命令,对比路径是否一致。如果不一致,要么把 Thonny 切到终端那个解释器,要么在终端用与解释器对应的 pip 命令重新装库。这条排查思路适用于所有“终端能用,IDE 不能用”的问题。
5.3 缩进错误 IndentationError:粘贴代码时最容易翻车
从网页教程或者文档里复制代码到 Thonny 时,经常会出现缩进混乱。原因是网页里的空格和 Tab 在复制时可能被转换成不同规则。遇到这种错误,最直接的做法是把编辑器里的代码全部选中,按一次 Tab 整体增加缩进级别,或者按 Shift+Tab 整体减少,然后重新手动逐行调整缩进。
如果你要从一个地方复制函数到另一个脚本,最好先在 Thonny 里把目标文件保存,再粘贴,粘贴后立刻检查行首是否有误。Thonny 在自动缩进上的设计是粘贴后保留原缩进,不做清理,这是它的一个“反人类”点,但知道了就绕得开。
5.4 Thonny 界面变卡或程序没有响应
树莓派 4B 的内存是 2GB 或 4GB,运行 Thonny 本身没问题,但如果同时打开多个浏览器窗口、多个标签页,或者运行重负载的 OpenCV 推理脚本,就可能出现卡顿。遇到这种情况,第一步先看系统监视器,确认 CPU 或内存占用情况,杀掉不必要的进程。
如果是 Thonny 自身无响应,多数情况卡在“等待后端进程退出”。这时不要直接关机,可以按 Ctrl+F2 强制停下当前后端进程,等几秒再继续。如果完全卡死,可以打开一个终端窗口,执行“pkill -f thonny”强制结束 Thonny 进程,重新启动。这里有一点经验:树莓派运行时频繁关闭再打开 Thonny,不如让 Thonny 常驻,因为重新启动它还要重新加载解释器,时间成本更高。
另外,如果你用了 GPIO 的无限循环,程序正常运行时按“停止”按钮,它有可能会卡顿一下才停下,这是正常的,因为 GPIO 的清理也需要一点时间。不要对明明已经标记“停止”的按钮连续点击,耐心等待即可。
5.5 权限和引脚冲突:细节决定稳定
最后再强调一下 GPIO 引脚冲突。很多树莓派教程会让你在几个脚本之间切换测试,如果不注意引脚占用,新的脚本运行时就会因为引脚被占据而报错。最干净的处理方式是在每个脚本的开头固定写一套“复位”逻辑,或者在运行时统一用 Ctrl+F2 重启后端。
我自己的习惯是,凡是用到 GPIO 的脚本,在文件开头都写 GPIO.setwarnings(False),在文件结尾或者 except 的清理块里写 GPIO.cleanup()。但这里有个陷阱:如果脚本是一个 while True 死循环,你可能永远到不了 cleanup 那行。这时候只能在 Shell 里手动执行 GPIO.cleanup(),或者重启后端。Thonny 重启后端之后,GPIO 模式会被重置,这个机制反而帮我们规避了一部分冲突问题。
我不能说 Thonny 是最强的 Python IDE,但至少在树莓派这个平台上,它是最省心的一个。你只需要记住那个窗口里各个按钮的位置,理解后端进程和变量视图是怎么回事,就已经能覆盖绝大部分入门项目的需求。等以后你写出更复杂的脚本,再迁移到 VSCode 或者连到远程服务器都不迟,但前期学习阶段,Thonny 的窗口就是树莓派 Python 开发的“主战场”。