scratch3.0二次開發(fā)之用blocks生成python代碼
在開始之前,先回顧下之前寫的文章《scratch3.0二次開發(fā)之blocks生成代碼思路》,在文章里大概地寫了生成代碼的幾個(gè)步驟,讀者看了可能還不太理解,這是根據(jù)我的開發(fā)經(jīng)驗(yàn)寫出來的?,F(xiàn)在具體寫寫實(shí)現(xiàn)的方法。
一、引入一個(gè)生成代碼的文件
比如要生成arduino代碼,就要引入生成arduino代碼的文件,要生成python代碼,就要引入python文件。
這個(gè)生成代碼的文件是從Blockly引入進(jìn)來的,scratch-blocks是在blockly的基礎(chǔ)上開發(fā)出來的?,F(xiàn)在的scratch-blocks是沒有g(shù)enerators目錄的,這個(gè)也可以從blockly那里copy過來。
具體分析blockly的python.js代碼:
Blockly.Python = new Blockly.Generator('Python');
python是blockl.generator的一個(gè)實(shí)例,會(huì)調(diào)用generator里的方法;
Blockly.Python.addReservedWords(...);
這方法的作用是給python添加關(guān)鍵字,blockly的python文件已經(jīng)設(shè)置了許多python的關(guān)鍵字在里面了。
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; // (...)
以上代碼設(shè)置了優(yōu)先級(jí)。
Blockly.python的其他方法請(qǐng)參考blockly的python文件。
二、定義生成的python代碼
需要對(duì)每個(gè)block定義生成的代碼。
1、獲取block的type
block是根據(jù)type來區(qū)分的,每個(gè)block的type是唯一的。scratch-blocks的基本blocks的定義是在scratch-blocks\blocks_vertical目錄里。
具體可以查閱之前的博客《scratch3.0二次開發(fā)之scratch-blocks中的blocks的類型、定義和使用方法》
以下是一個(gè)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語(yǔ)句:
Blockly.Python['motion_movesteps'] = function (block) { var steps = Blockly.Python.valueToCode(block, "STEPS", Blockly.Python.ORDER_NONE); return 'move ' + steps + ' steps\n'; };
2、獲取參數(shù)的值
根據(jù)參數(shù)的類型,選擇Blockly.Python.valueToCode、block.getFieldValue還是Blockly.Python.statementToCode來獲取值。
type類型 | 方法 |
---|---|
input_value | Blockly.Python.valueToCode |
input_statement | Blockly.Python.statementToCode |
field_* | block.getFieldValue |
3、從xml來解析一個(gè)塊的組成結(jié)構(gòu)
這是motion_movesteps塊的xml結(jié)構(gòu),它由兩個(gè)block組成,"motion_movesteps"和“math_number”,shadow也是一個(gè)block;
<block type="motion_movesteps"> <value name="STEPS"> <shadow type="math_number"> <field name="NUM">10</field> </shadow> </value> </block>
所以除了上面已經(jīng)定義好的"motion_movesteps"生成python語(yǔ)句,還需要的定義math_number的生成語(yǔ)句
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、根據(jù)塊的形狀來設(shè)置return的數(shù)據(jù)類型
形狀 | return的類型 |
---|---|
![]() |
字符串 |
![]() |
字符串 |
![]() |
[code, order] 數(shù)組 |
![]() |
[code, order] 數(shù)組 |
引入模塊:Blockly.Python.definitions_[模塊名] = ”import xxxx";
聲明函數(shù):Blockly.Python.definitions_[模塊名] = ”def xxx …";
三、生成python代碼
在scratch-gui/src/containers/block.jsx文件中,對(duì)workspace添加監(jiān)聽
this.workspace.addChangeListener(this.generatPythonCode);
四、結(jié)語(yǔ)
本文主要介紹了blocks生成python代碼的方法,由于篇幅有限,寫的也不是很全面,不過大概地生成方法也就這些。如果在開發(fā)地過程中碰到問題,可以私信我給我留言,我盡可能地幫助大家解決問題
到此這篇關(guān)于scratch3.0二次開發(fā)之用blocks生成python代碼的文章就介紹到這了,更多相關(guān)scratch blocks生成python代碼內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python中排序函數(shù)sorted()函數(shù)的使用實(shí)例
sorted()作為Python內(nèi)置函數(shù)之一,其功能是對(duì)序列(列表、元組、字典、集合、還包括字符串)進(jìn)行排序,下面這篇文章主要給大家介紹了關(guān)于Python中排序函數(shù)sorted()函數(shù)的相關(guān)資料,需要的朋友可以參考下2022-11-11八個(gè)超級(jí)好用的Python自動(dòng)化腳本(小結(jié))
每天你都可能會(huì)執(zhí)行許多重復(fù)的任務(wù),例如閱讀新聞、發(fā)郵件、查看天氣、打開書簽、清理文件夾等等,本文主要介紹了Python自動(dòng)化腳本,具有一定的參考價(jià)值,感興趣的可以了解一下2022-07-07Python實(shí)現(xiàn)刪除某列中含有空值的行的示例代碼
這篇文章主要介紹了Python實(shí)現(xiàn)刪除某列中含有空值的行的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07python爬蟲爬取某圖書網(wǎng)頁(yè)實(shí)例講解
這篇文章主要介紹了python爬蟲爬取某圖書網(wǎng)頁(yè)實(shí)例,下面是通過requests庫(kù)來對(duì)ajax頁(yè)面進(jìn)行爬取的案例,與正常頁(yè)面不同,這里我們獲取url的方式也會(huì)不同,這里我們通過爬取一個(gè)簡(jiǎn)單的ajax小說頁(yè)面來為大家講解,需要的朋友可以參考下2024-08-08python實(shí)現(xiàn)搜索指定目錄下文件及文件內(nèi)搜索指定關(guān)鍵詞的方法
這篇文章主要介紹了python實(shí)現(xiàn)搜索指定目錄下文件及文件內(nèi)搜索指定關(guān)鍵詞的方法,可實(shí)現(xiàn)針對(duì)文件夾及文件內(nèi)關(guān)鍵詞的搜索功能,需要的朋友可以參考下2015-06-06django學(xué)習(xí)之a(chǎn)jax post傳參的2種格式實(shí)例
AJAX除了異步的特點(diǎn)外,還有一個(gè)就是:瀏覽器頁(yè)面局部刷新,下面這篇文章主要給大家介紹了關(guān)于django學(xué)習(xí)之a(chǎn)jax post傳參的2種格式的相關(guān)資料,需要的朋友可以參考下2021-05-05Python實(shí)現(xiàn)遍歷數(shù)據(jù)庫(kù)并獲取key的值
本文給大家分享的是Python實(shí)現(xiàn)遍歷數(shù)據(jù)庫(kù)并獲取key的值的方法,主要是使用for循環(huán)來實(shí)現(xiàn),有需要的小伙伴可以參考下。2015-05-05