Bipes-Blockly项目二次开发/web-python(四)

72 阅读2分钟

Bipes-Blockly项目二次开发/web-python(四)

网页运行python代码,这个功能bipes项目是没有的,bipes运行python是要和硬件进行连接成功后,向硬件发送代码或指令,才能运行python。

这次,我将使用skulpt.js插件,实现网页运行python,以及后续海龟画图功能。 项目地址:maxuecan.github.io/Bipes/index…

python插件选择

前端python插件其实有很多,例如:Brython,Skulpt,Pyodide等。这里使用Skulpt,如果需要更丰富的功能,可以使用Brython等。

Skulpt.js插件

安装插件
npm install skulpt -S

通信

这里借助node,events功能块做模块通信

const EventEmitter = require('events')

class EventEmitterController extends EventEmitter {
    constructor() {
        super()
			 // 事件监听
        this.on('open-control-pewivew', () => {
            this.emit('control-pewivew-change-console', true)
        })
    }
}

export default new EventEmitterController()

js引用

skulpt的使用也比较简单,首先是初始化Sk.configure,绑定输出,读取函数,最后给按钮添加事件。

// 使用方式一
import * as Sk from 'skulpt';
// 使用方式二
// import 'skulpt/dist/skulpt.js';
// import 'skulpt/dist/skulpt-stdlib.js';
import Common from '../components/common'
import EventEmitterController from './event-emitter-controller'

export default class SkulptController extends Common {
    constructor() {
        super()
        /* skulpt初始化配置 */
        Sk.pre = "output";
        Sk.configure({
            output: this.outF, // 输出函数
            read: this.buildinRead, // 读取函数
            __future__: Sk.python3, // 启用python3特性
        });

        this.sk = Sk
    }
    initEvent() {
        // 运行按钮
        $('#sk-run').on('click', () => {
            this.runPythonCode()
            EventEmitterController.emit('open-control-pewivew')
        })
    }
    // 输出内容,将结果输出在终端
    outF(text) {
        term.write(text + '\r')
    }
    buildinRead(file) {
        // console.log("Attempting file: " + Sk.ffi.remapToJs(file));
        if (
            Sk.builtinFiles === undefined ||
            Sk.builtinFiles.files[file] === undefined
        ) {
            throw "File not found: '" + file + "'";
        }

        return Sk.builtinFiles.files[file];
    }
    // 执行python代码
    runPythonCode() {
        let code = Code.generateCode()

        let myPromise = this.sk.misceval.asyncToPromise(() => {
            return this.sk.importMainWithBody("<stdin>", false, code, true);
        });

        myPromise
            .then((res) => {})
            .catch((err) => {})
    }
}

界面效果

在这里插入图片描述

总结

在没有连接硬件的情况下,前端运行python,只能建立在对一些基础编程语法的认识,学习等,适用范围比较有限。要想在教育里面涉及更多,还是得和硬件结合。skulpt插件能做不止运行python,还能做海归图像化,后面也会尝试把这个功能加进去,以及保留原有的硬件连接三种模式。