一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

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

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲欧洲综合 | 好湿好紧好大野战 | 青草青青在线视频观看 | 免费看片黄 | 日本一道本中文字幕 | 小仙夜晚慰自催眠mp3护士篇 | 国产免费美女视频 | 国产极品美女在线 | 美女免费观看一区二区三区 | 日本不卡高清免费v日本 | 国产欧美日韩在线观看精品 | 97影院秋霞国产精品 | 国产自在自线午夜精品之la | 短篇最污的乱淫伦小说全集 | 高h辣h双处全是肉军婚 | 91在线精品国产 | a级精品九九九大片免费看 a级动漫 | 吉川爱美与黑人解禁 | 操尼姑| 日韩精品国产自在欧美 | 亚洲AV综合99一二三四区 | sss在线观看免费视频 | 日本在线观看a | 91欧美秘密入口 | 性欧美高清强烈性视频 | 日本一卡二卡3卡四卡无卡网址 | 亚洲欧美在线观看首页 | 亚洲成年网站在线观看 | bdsm酷刑折磨死美女 | 国产a一级| 国产精品66福利在线观看 | 美女扒开粉嫩尿口漫画 | 激情视频亚洲 | 精品久久久久久无码人妻国产馆 | 236zz宅宅最新伦理 | 成人福利网站含羞草 | 无遮挡h肉动漫高清在线 | 欧美坐爱| 波多野结衣在线观看中文字幕 | 男人女人性生活视频 | 免费看美女被靠到爽 |