scratch3.0二次开发之用blocks生成python代码

目录
  • 一、引入一个生成代码的文件
  • 二、定义生成的python代码
    • 1、获取block的type
    • 2、获取参数的值
    • 3、从xml来解析一个块的组成结构
  • 三、生成python代码
  • 四、结语

在开始之前,先回顾下之前写的文章《scratch3.0二次开发之blocks生成代码思路》,在文章里大概地写了生成代码的几个步骤,读者看了可能还不太理解,这是根据我的开发经验写出来的。现在具体写写实现的方法。

一、引入一个生成代码的文件

比如要生成arduino代码,就要引入生成arduino代码的文件,要生成python代码,就要引入python文件。

这个生成代码的文件是从Blockly引入进来的,scratch-blocks是在blockly的基础上开发出来的。现在的scratch-blocks是没有generators目录的,这个也可以从blockly那里copy过来。
具体分析blockly的python.js代码:

Blockly.Python = new Blockly.Generator('Python');

python是blockl.generator的一个实例,会调用generator里的方法;

Blockly.Python.addReservedWords(...);

这方法的作用是给python添加关键字,blockly的python文件已经设置了许多python的关键字在里面了。

Blockly.Python.ORDER_ATOMIC = 0;            // 0 "" ...
Blockly.Python.ORDER_COLLECTION = 1;        // tuples, lists, dictionaries
Blockly.Python.ORDER_STRING_CONVERSION = 1; // `expression...`
Blockly.Python.ORDER_MEMBER = 2.1;          // . []
Blockly.Python.ORDER_FUNCTION_CALL = 2.2;   // ()
Blockly.Python.ORDER_EXPONENTIATION = 3;    // **
Blockly.Python.ORDER_UNARY_SIGN = 4;        // + -
Blockly.Python.ORDER_BITWISE_NOT = 4;       // ~
Blockly.Python.ORDER_MULTIPLICATIVE = 5;    // * / // %
Blockly.Python.ORDER_ADDITIVE = 6;          // + -
Blockly.Python.ORDER_BITWISE_SHIFT = 7;     // << >>
Blockly.Python.ORDER_BITWISE_AND = 8;       // &
Blockly.Python.ORDER_BITWISE_XOR = 9;       // ^
Blockly.Python.ORDER_BITWISE_OR = 10;       // |
Blockly.Python.ORDER_RELATIONAL = 11;       // in, not in, is, is not,
                                            //     <, <=, >, >=, <>, !=, ==
Blockly.Python.ORDER_LOGICAL_NOT = 12;      // not
Blockly.Python.ORDER_LOGICAL_AND = 13;      // and
Blockly.Python.ORDER_LOGICAL_OR = 14;       // or
Blockly.Python.ORDER_CONDITIONAL = 15;      // if else
Blockly.Python.ORDER_LAMBDA = 16;           // lambda
Blockly.Python.ORDER_NONE = 99;             // (...)

以上代码设置了优先级。
Blockly.python的其他方法请参考blockly的python文件。

二、定义生成的python代码

需要对每个block定义生成的代码。

1、获取block的type

block是根据type来区分的,每个block的type是唯一的。scratch-blocks的基本blocks的定义是在scratch-blocks\blocks_vertical目录里。
具体可以查阅之前的博客《scratch3.0二次开发之scratch-blocks中的blocks的类型、定义和使用方法》

以下是一个type为“motion_movesteps”的block块的定义

Blockly.Blocks['motion_movesteps'] = {
  /**
   * Block to move steps.
   * @this Blockly.Block
   */
  init: function() {
    this.jsonInit({
      "message0": Blockly.Msg.MOTION_MOVESTEPS,
      "args0": [
        {
          "type": "input_value",
          "name": "STEPS"
        }
      ],
      "category": Blockly.Categories.motion,
      "extensions": ["colours_motion", "shape_statement"]
    });
  }
};

定义生成的python语句:

 Blockly.Python['motion_movesteps'] = function (block) {
        var steps = Blockly.Python.valueToCode(block, "STEPS", Blockly.Python.ORDER_NONE);
        return 'move ' + steps + ' steps\n';
    };

2、获取参数的值

根据参数的类型,选择Blockly.Python.valueToCode、block.getFieldValue还是Blockly.Python.statementToCode来获取值。

type类型 方法
input_value Blockly.Python.valueToCode
input_statement Blockly.Python.statementToCode
field_* block.getFieldValue

3、从xml来解析一个块的组成结构

这是motion_movesteps块的xml结构,它由两个block组成,"motion_movesteps"和“math_number”,shadow也是一个block;

<block type="motion_movesteps">
            <value name="STEPS">
                <shadow type="math_number">
                    <field name="NUM">10</field>
                </shadow>
            </value>
        </block>

所以除了上面已经定义好的"motion_movesteps"生成python语句,还需要的定义math_number的生成语句

Blockly.Python['math_number'] = function(block) {
  // Numeric value.
  var code = parseFloat(block.getFieldValue('NUM'));
  var order;
  if (code == Infinity) {
    code = 'float("inf")';
    order = Blockly.Python.ORDER_FUNCTION_CALL;
  } else if (code == -Infinity) {
    code = '-float("inf")';
    order = Blockly.Python.ORDER_UNARY_SIGN;
  } else {
    order = code < 0 ? Blockly.Python.ORDER_UNARY_SIGN :
            Blockly.Python.ORDER_ATOMIC;
  }
  return [code, order];
}

4、根据块的形状来设置return的数据类型

形状 return的类型
字符串
字符串
[code, order] 数组
[code, order] 数组

引入模块:Blockly.Python.definitions_[模块名] = ”import xxxx";
声明函数:Blockly.Python.definitions_[模块名] = ”def xxx …";

三、生成python代码

在scratch-gui/src/containers/block.jsx文件中,对workspace添加监听

 this.workspace.addChangeListener(this.generatPythonCode);

四、结语

本文主要介绍了blocks生成python代码的方法,由于篇幅有限,写的也不是很全面,不过大概地生成方法也就这些。如果在开发地过程中碰到问题,可以私信我给我留言,我尽可能地帮助大家解决问题

到此这篇关于scratch3.0二次开发之用blocks生成python代码的文章就介绍到这了,更多相关scratch blocks生成python代码内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 详解scratch3.0二次开发之scratch-blocks中的blocks的类型、定义和使用方法

    scratch-blocks是scratch-gui依赖的一个基本模块.它的作用是生成gui界面上的blocks.(有关scratch-blocks的方法可以看我上一篇博客<scratch3.0二次开发之scratch-blocks的免编译修改方法>).blocks的作用是通过拖曳的方法组成blocks堆块,点击greenflag控件,舞台区(stage)会有相应的变化. scratch-gui的blocks的生成文件在scratch-blocks\blocks_vertical里. bloc

  • Scratch3.0二次开发之windows环境下打包成exe的流程

    先给大家看下Scratch3.0二次开发之windows环境下打包成exe的流程. 1.需要先安装npm,安装过程不作过多介绍了. 2.直接介绍打包成exe流程. (1)首先在scratch-gui目录下 cd scratch-gui npm install 设置静态文件路径 set BUILD_MODE=dist set STATIC_PATH=static build scratch-gui npm run build 设置链接 npm link (2)进入scratch-desktop目录

  • Scratch3.0 页面初始化同时加载sb3文件的操作代码

    scratch是一种非常合适的培养自己的编程兴趣的方式.通过拖拽的方式,可以实现一些游戏,小程序的开发,就像搭积木一样,下面给大家介绍Scratch3.0 页面初始化同时加载sb3文件的操作方法,一起看看吧! 目标文件地址:src\containers\sb-file-uploader.jsx 修改 sb-file-uploader.jsx文件, class SBFileUploader中添加componentDidMount(),代码如下 componentDidMount() { var _

  • 解析scratch3.0二次开发之scratch-blocks免编译修改问题

    scratch-blocks编译的时候会出现的问题:scratch-gui依赖的scratch-blocks模块在安装的时候编译会报错. 原因:scratch-blocks编译时要调用的build.py文件运行时发生错误.windowst系统下,代码压缩的过程是build.py通过一个closure-library的插件处理后,发送到谷歌的服务器进行压缩,返回的结果会生成blocks_compressed.js,blocks_compressed_horizontal.js,blocks_com

  • scratch3.0二次开发之用blocks生成python代码

    目录 一.引入一个生成代码的文件 二.定义生成的python代码 1.获取block的type 2.获取参数的值 3.从xml来解析一个块的组成结构 三.生成python代码 四.结语 在开始之前,先回顾下之前写的文章<scratch3.0二次开发之blocks生成代码思路>,在文章里大概地写了生成代码的几个步骤,读者看了可能还不太理解,这是根据我的开发经验写出来的.现在具体写写实现的方法. 一.引入一个生成代码的文件 比如要生成arduino代码,就要引入生成arduino代码的文件,要生成

  • 微信小程序开发之IOS和Android兼容的问题

    微信小程序开发之IOS和Android兼容的问题 一.时间转换问题: 这不只是小程序上面的问题是ios系统 都有这个问题 就是new  Date("2017-06-16") 在IOS会出现NAN的情况所以对于时间转换需要另行封装,解决方案如下 1.替换"-"为"/" 2.删除"."后面的字符串(带毫秒也会有问题) 代码如下: /** * 字符串转换为时间 * @param {String} src 字符串 */ strToDa

  • IOS 开发之UILabel 或者 UIButton加下划线链接

    IOS 开发之UILabel 或者 UIButton加下划线链接          本文主要介绍了IOS中 UILable及UIButton的带下划线链接的实现方法及附有源码下载,大家开发IOS 应用有需要的可以参考下: 方法一: NSMutableAttributedString *str = [[NSMutableAttributedString alloc] initWithString:@"查看所有中奖记录"]; NSRange strRange = {0,[str lengt

  • IOS开发之tableView点击行跳转并带有“显示”更多功能

    首先给大家展示下效果图,觉得还满意的话,请继续学习代码实现过程. 一,工程图. 二,代码. RootViewController.h #import <UIKit/UIKit.h> @interface RootViewController : UIViewController <UITableViewDelegate,UITableViewDataSource> { UITableView * _tableView; NSMutableArray * provinceArray;

  • Java开发之request对象常用方法整理

     Java开发之request对象常用方法整理 本文主要介绍了Java中的request对象,并且对request对象中的一些常用方法作了一点总结,如果你是Java初学者,或许这篇文章对你会有所帮助. HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,开发人员通过这个对象的方法,可以获得客户这些信息. request常用方法: 一.获取客户机环境信息常见方法: 1.getRequestURL方法返回客户端

  • Asp.net开发之webform图片水印和图片验证码的实现方法

    两者都需要引入命名空间:using System.Drawing; 一.图片水印 前台Photoshuiyin.aspx代码: <div> <asp:FileUpload ID="FileUpload1" runat="server" /> <asp:Button ID="Button1" runat="server" Text="上传" /><br /> &

  • Android编程开发之TextView文字显示和修改方法(附TextView属性介绍)

    本文实例讲述了Android编程开发之TextView文字显示和修改方法.分享给大家供大家参考,具体如下: 一. 新建一个Activity 和 Layout 首先在layout文件夹中新建一个activity_main.xml,在新建工程的时候一般默认会新建此xml文件,修改其代码如下: activity_main.xml 代码 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" x

随机推荐