🐍 PyVisual Pro:我在浏览器里造了一个 Python 可视化编辑器,零安装即开即用

90 阅读4分钟

项目地址:pythonvisualeditor.netlify.app
技术栈:原生 HTML/JS + Skulpt + CodeMirror 5


一、为什么要做这个项目?

作为一个常年和 H5 游戏打交道的人,我见过太多新手被 Python 环境配置劝退的场景:

  • pip install 报错红一片
  • Python 版本冲突搞到怀疑人生
  • 想画个图还得装 matplotlib,结果依赖地狱...

"能不能让小白在浏览器里直接写 Python、直接看到效果?"

这就是 PyVisual Pro 诞生的原因——零安装、零配置,打开浏览器就能跑 Python,还能实时可视化输出。


二、核心功能一览

1. 🚀 浏览器内运行 Python(真·无需后端)

核心依赖是 Skulpt——一个用 JavaScript 实现的 Python 解释器。它能把 Python 代码编译成 JS 执行,完全在客户端运行:

JavaScript

复制

// 初始化 Skulpt 引擎
Sk.configure({
    output: outf,           // 标准输出捕获
    read: builtinRead,      // 文件读取
    inputfun: inputfun      // input() 支持
});

这意味着:

  • ✅ 不需要服务器,纯静态托管(我用的 Netlify)
  • ✅ 代码在本地执行,隐私安全
  • ✅ 加载一次后离线也能用

2. 🎨 Turtle 图形实时渲染

最香的功能!写几行代码就能画图:

Python

复制

import turtle

t = turtle.Turtle()
for i in range(36):
    t.circle(100)
    t.right(10)

Skulpt 会把 turtle 指令映射到 HTML5 Canvas 上,实时渲染。支持:

  • 前进/后退/转向 (forward, left, right)
  • 画笔控制 (penup, pendown, pensize, color)
  • 填充 (begin_fill, end_fill)
  • 下载生成的图片

3. ✨ 类 VS Code 的编辑体验

CodeMirror 5 搭建的编辑器,功能一点不含糊:

表格

功能实现细节
语法高亮Python mode + 自定义 token
智能提示自建 200+ 关键词库,支持属性补全
错误定位运行时捕获异常,高亮错误行并跳转
快捷键F5 运行、Ctrl+S 保存、Ctrl+N 新建
自动保存2 秒无操作自动写入 localStorage

智能提示的贴心设计:

输入 str. 会自动提示字符串方法(split, replace 等),输入 turtle. 会提示图形 API,类型标签一目了然:

plain

复制

split   str
replace str
forward turtle

4. 🌓 深浅主题一键切换

右上角 🌓 按钮切换,基于 CSS 变量实现:

css

复制

:root {
    --bg-primary: #f8f9fa;
    --accent-color: #1a73e8;
}

[data-theme="dark"] {
    --bg-primary: #1e1e1e;
    --accent-color: #4ec9b0;  /* VS Code 同款青绿色 */
}

暗色主题配色参考了 VS Code 的 Monokai,代码高亮也会同步切换。


三、技术实现细节(踩坑记录)

坑 1:Skulpt 的 input() 会阻塞执行

Skulpt 默认的 inputfun 返回 Promise,但在某些情况下会导致执行卡住。我的解决方案是强制使用同步的 window.prompt

JavaScript

复制

function inputfun(prompt) {
    return window.prompt(prompt || "输入:");
}

虽然交互简陋了点,但胜在稳定不卡死。

坑 2:Turtle 画布的生命周期管理

每次运行新代码前必须清空旧画布,否则图形会叠加。我的处理逻辑:

JavaScript

复制

const container = document.getElementById('turtle-container');
const placeholder = document.getElementById('canvasPlaceholder');
container.innerHTML = '';           // 清空所有 canvas
container.appendChild(placeholder); // 放回占位符

同时用 Sk.TurtleGraphics.target 指定渲染容器,让 Skulpt 知道往哪画。

坑 3:死循环导致页面卡死

加个超时保护(15 秒),用 Promise.race 实现:

JavaScript

复制

const timeoutPromise = new Promise((_, reject) => {
    setTimeout(() => reject(new Error('执行超时')), 15000);
});

await Promise.race([runPromise, timeoutPromise]);

超时后自动终止,并提示用户检查是否有死循环。


四、代码架构解析

plain

复制

PyVisual Pro
├── 编辑器层 (CodeMirror)
│   ├── 语法高亮 (python.js)
│   ├── 自动补全 (show-hint.js + 自定义 hint 函数)
│   └── 快捷键绑定 (F5/Ctrl+S/Ctrl+N)
├── 执行层 (Skulpt)
│   ├── Python → JS 编译
│   ├── 输出捕获 (outf)
│   ├── 输入处理 (inputfun)
│   └── Turtle → Canvas 映射
└── UI 层
    ├── 主题切换 (CSS 变量)
    ├── 标签页切换 (控制台/画布)
    ├── 示例代码库 (9 个内置模板)
    └── 文件操作 (新建/打开/保存)

内置的 9 个示例代码:

表格

分类示例
基础Hello World、变量与运算、循环结构
Turtle正方形、圆形、彩色螺旋、分形树
算法斐波那契数列、素数判断

点击"示例"按钮直接加载,新手可以边改边学。


五、适用场景

  1. 编程入门教学 - 老师投屏演示,学生跟着敲
  2. 快速验证想法 - 不用开 PyCharm,浏览器秒开
  3. Turtle 图形学习 - 可视化反馈即时,成就感强
  4. 面试/考试环境 - 统一环境,避免配置差异

六、未来规划

  • 支持 matplotlib 基础图表(Skulpt 有实验性支持)
  • 代码分享功能(生成短链接)
  • 多文件项目管理
  • 移动端适配优化

七、结语

PyVisual Pro 不是什么高大上的框架,只是一个把几样成熟技术拼在一起、解决具体痛点的小工具。但正是这种"开箱即用"的体验,能降低编程的入门门槛。

如果你也在做教育类产品,或者想给团队搞个轻量级的 Python 演练环境,欢迎参考这个项目。代码完全开源(单 HTML 文件),部署到 Netlify/Vercel 只要 30 秒。

🔗 在线体验: pythonvisualeditor.netlify.app


如果这篇分享对你有帮助,欢迎点赞收藏~ 有问题评论区留言,我会回复! p.s.第一次点开运行时需要下载20到30M的pyodide包,加载有点慢,以后就好了,稍等一下哦~谢谢!