人妖在线一区,国产日韩欧美一区二区综合在线,国产啪精品视频网站免费,欧美内射深插日本少妇

新聞動(dòng)態(tài)

scratch3.0二次開(kāi)發(fā)之用blocks生成python代碼

發(fā)布日期:2022-02-12 12:50 | 文章來(lái)源:站長(zhǎng)之家

在開(kāi)始之前,先回顧下之前寫(xiě)的文章《scratch3.0二次開(kāi)發(fā)之blocks生成代碼思路》,在文章里大概地寫(xiě)了生成代碼的幾個(gè)步驟,讀者看了可能還不太理解,這是根據(jù)我的開(kāi)發(fā)經(jīng)驗(yàn)寫(xiě)出來(lái)的。現(xiàn)在具體寫(xiě)寫(xiě)實(shí)現(xiàn)的方法。

一、引入一個(gè)生成代碼的文件

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

這個(gè)生成代碼的文件是從Blockly引入進(jìn)來(lái)的,scratch-blocks是在blockly的基礎(chǔ)上開(kāi)發(fā)出來(lái)的?,F(xiàn)在的scratch-blocks是沒(méi)有g(shù)enerators目錄的,這個(gè)也可以從blockly那里copy過(guò)來(lái)。
具體分析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來(lái)區(qū)分的,每個(gè)block的type是唯一的。scratch-blocks的基本blocks的定義是在scratch-blocks\blocks_vertical目錄里。
具體可以查閱之前的博客《scratch3.0二次開(kāi)發(fā)之scratch-blocks中的blocks的類(lèi)型、定義和使用方法》

以下是一個(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ù)的類(lèi)型,選擇Blockly.Python.valueToCode、block.getFieldValue還是Blockly.Python.statementToCode來(lái)獲取值。

type類(lèi)型 方法
input_value Blockly.Python.valueToCode
input_statement Blockly.Python.statementToCode
field_* block.getFieldValue

3、從xml來(lái)解析一個(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ù)塊的形狀來(lái)設(shè)置return的數(shù)據(jù)類(lèi)型

形狀 return的類(lèi)型
字符串
字符串
[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)聽(tīng)

 this.workspace.addChangeListener(this.generatPythonCode);

四、結(jié)語(yǔ)

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

到此這篇關(guān)于scratch3.0二次開(kāi)發(fā)之用blocks生成python代碼的文章就介紹到這了,更多相關(guān)scratch blocks生成python代碼內(nèi)容請(qǐng)搜索本站以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持本站!

海外服務(wù)器租用

版權(quán)聲明:本站文章來(lái)源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請(qǐng)保持原文完整并注明來(lái)源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來(lái)源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來(lái),僅供學(xué)習(xí)參考,不代表本站立場(chǎng),如有內(nèi)容涉嫌侵權(quán),請(qǐng)聯(lián)系alex-e#qq.com處理。

相關(guān)文章

實(shí)時(shí)開(kāi)通

自選配置、實(shí)時(shí)開(kāi)通

免備案

全球線(xiàn)路精選!

全天候客戶(hù)服務(wù)

7x24全年不間斷在線(xiàn)

專(zhuān)屬顧問(wèn)服務(wù)

1對(duì)1客戶(hù)咨詢(xún)顧問(wèn)

在線(xiàn)
客服

在線(xiàn)客服:7*24小時(shí)在線(xiàn)

客服
熱線(xiàn)

400-630-3752
7*24小時(shí)客服服務(wù)熱線(xiàn)

關(guān)注
微信

關(guān)注官方微信
頂部