国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - scratch3.0二次開發之用blocks生成python代碼

scratch3.0二次開發之用blocks生成python代碼

2021-12-20 00:11取個昵稱就那么難 Python

python是blockl.generator的一個實例,會調用generator里的方法,這篇文章主要介紹了scratch3.0二次開發之用blocks生成python代碼,需要的朋友可以參考下

在開始之前,先回顧下之前寫的文章《scratch3.0二次開發之blocks生成代碼思路》,在文章里大概地寫了生成代碼的幾個步驟,讀者看了可能還不太理解,這是根據我的開發經驗寫出來的。現在具體寫寫實現的方法。

一、引入一個生成代碼的文件

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

這個生成代碼的文件是從blockly引入進來的,scratch-blocks是在blockly的基礎上開發出來的。現在的scratch-blocks是沒有generators目錄的,這個也可以從blockly那里copy過來。
具體分析blockly的python.js代碼:

?
1
blockly.python = new blockly.generator('python');

python是blockl.generator的一個實例,會調用generator里的方法;

?
1
blockly.python.addreservedwords(...);

這方法的作用是給python添加關鍵字,blockly的python文件已經設置了許多python的關鍵字在里面了。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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塊的定義

scratch3.0二次開發之用blocks生成python代碼

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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語句:

?
1
2
3
4
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;

?
1
2
3
4
5
6
7
<block type="motion_movesteps">
            <value name="steps">
                <shadow type="math_number">
                    <field name="num">10</field>
                </shadow>
            </value>
        </block>

所以除了上面已經定義好的"motion_movesteps"生成python語句,還需要的定義math_number的生成語句

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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的類型
scratch3.0二次開發之用blocks生成python代碼 字符串
scratch3.0二次開發之用blocks生成python代碼 字符串
scratch3.0二次開發之用blocks生成python代碼 [code, order] 數組
scratch3.0二次開發之用blocks生成python代碼 [code, order] 數組

引入模塊:blockly.python.definitions_[模塊名] = ”import xxxx";
聲明函數:blockly.python.definitions_[模塊名] = ”def xxx …";

scratch3.0二次開發之用blocks生成python代碼

三、生成python代碼

在scratch-gui/src/containers/block.jsx文件中,對workspace添加監聽

?
1
this.workspace.addchangelistener(this.generatpythoncode);

四、結語

本文主要介紹了blocks生成python代碼的方法,由于篇幅有限,寫的也不是很全面,不過大概地生成方法也就這些。如果在開發地過程中碰到問題,可以私信我給我留言,我盡可能地幫助大家解決問題

到此這篇關于scratch3.0二次開發之用blocks生成python代碼的文章就介紹到這了,更多相關scratch blocks生成python代碼內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://blog.csdn.net/jyht1226/article/details/106135828

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 欧美日韩精品免费观看 | 一级做a爰片性色毛片精油 欧美中文字幕在线观看 | 爱色av网址 | 永久免费av| 精品亚洲一区二区 | 色综合天天综合网国产成人综合天 | 亚洲激情视频 | 久久久久久久91 | 亚洲视频 欧美视频 | 日本视频中文字幕 | av网址在线| 精品一区二区三区中文字幕老牛 | 亚洲一二三 | 日韩av电影在线观看 | 在线观看欧美一区 | 99久久婷婷国产综合精品草原 | 国产成人小视频 | 麻豆国产一区二区三区 | 国产做a爰片久久毛片a我的朋友 | 久久九九国产精品 | 久久综合久色欧美综合狠狠 | 国产精品99 | 亚洲五月婷婷 | 国产成人免费 | 天天干天天插 | 国产精品久久久久久福利一牛影视 | 国产一区二区三区精品久久久 | 操操网站 | 亚洲一区视频在线 | 九九导航| 中文字幕一区二区三区乱码在线 | 久久嗨 | 综合网伊人 | 四虎视频 | 精品国产乱码久久久久久影片 | 91精品国产综合久久久久久丝袜 | 午夜精品一区二区三区在线播放 | 免费黄色大片网址 | a级在线免费视频 | 一区二区三区高清不卡 | 中文字幕av在线播放 |