目錄
- 一、引入一個生成代碼的文件
- 二、定義生成的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代碼內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!
您可能感興趣的文章:- 詳解scratch3.0二次開發之scratch-blocks中的blocks的類型、定義和使用方法
- Scratch3.0二次開發之windows環境下打包成exe的流程
- Scratch3.0 頁面初始化同時加載sb3文件的操作代碼
- 解析scratch3.0二次開發之scratch-blocks免編譯修改問題