google可视化编程工具blockly入门

什么是blockly?

blockly是google发布的可视化编程工具,是一个基于web技术构建的库;blockly的目的是帮助客户创建app,使得用户(app的使用者)编程就像搭积木一样的有趣、容易上手,大名鼎鼎的scratch就是一款使用类似技术的少儿编程工具。blockly有几个特点:

  1. 它是纯粹的javascript库。
  2. 它是100%面对客户端的,没有任何服务端的依赖。
  3. 支持各种主流的浏览器:Chrome, Firefox, Safari, Opera, and IE。
  4. 高度可定制和可扩展。

如果把blockly看作一个黑盒,它的输入就是用户拖放的代码块的组合,输出就是翻译出的JavaScript/python/PHP/Lua/Dart代码。

blockly能做什么?

近期工作的主要任务是针对公司的自动化测试框架进行改造,目前我司自动化测试就是使用python+selenium的方式进行自动化测试,测试人员需要使用原生的python代码进行测试用例的编写,对编程技能要求较高,我希望通过引入blockly为测试人员提供一个可视化的、搭建积木式的编写测试用例的GUI接口,降低自动化测试的上手门槛。

blockly上手示例

前提条件:需要对HTML、CSS、JavaScript有基本的了解

google官方提供的上手示例教程,这个示例是通过blockly创建一个简单的创造音乐的app,首先下载如下示例代码:

git clone https://github.com/google/blockly-samples.git

本示例代码路径如下:

getting-started-codelab
  • starter-code:为示例的初始代码;
  • complete-code:为示例完成后的代码,如果自己编写期间遇到卡壳的地方,可以和官方提供的完成代码进行对照。

每个目录都包含同样的目录和文件:

  • scripts/main.js - app的主逻辑代码
  • music_maker.js - 一个小型的用来播放声音的库
  • sounds/ - 声音文件
  • styles/ - CSS样式文件
  • index.html - 首页

浏览器打开starter-code/index.html,显示如下界面(如果首次打开不能完整显示,可能是网络原因,尝试刷新浏览器试试)

starter-code首页

编辑模式:

点击edit进行编辑模式,按照提示点击下方的任意数字进行代码编辑

编辑模式

点击任意一个数字之后,将显示一篇空白区域,这里就是我们需要使用blockly进行编码的地方

点击数字进行代码编辑

编辑index.html,在如下两行script代码之前增加一行代码,引入blockly库,

<script src="https://unpkg.com/blockly"></script>   <!-- 这一行是增加的代码 -->
<script src="scripts/music_maker.js"></script>
<script src="scripts/main.js"></script>

blockly将引入四个模块:

  • Blockly core: 主要的核心代码,主要定义了block UI及逻辑
  • Built-in block definitions: 常用的积木块定义如循环, 逻辑, 数据, 和字符串操作
  • The JavaScript generator: 将积木块生成JavaScript代码
  • English language files: 积木块的提示语言使用英语

创建blockly工作区:

工作区包括代码块编辑区和工具箱两部分

blocky工作区

编辑index.html在id="blocklyDiv"的div元素中增加如下xml结构:

<xml id="toolbox" style="display: none">
  <block type="controls_repeat_ext">
  <value name="TIMES">
    <shadow type="math_number">
    <field name="NUM">5</field>
    </shadow>
  </value>
  </block>
</xml>

编辑scripts/main.js,在代码的最后添加如下代码

Blockly.inject('blocklyDiv', {
    toolbox: document.getElementById('toolbox'),
    scrollbars: false
  });

现在刷新浏览器,点击edit进入编辑模式,点击任意数字,可以发现显示了blockly工具去,工具箱有一个代码块

toolbox工具箱有一个代码块

创建定制的代码块

本示例是一个创建音乐的app,我们需要创建一个能够播放声音的代码块,通过下拉菜单的方式选择不同的声音文件。

scripts目录下创建一个js文件,命名为sound_blocks.js,并在index.html首页中引入该js文件

<script src="https://unpkg.com/blockly"></script>
<script src="scripts/music_maker.js"></script>
<script src="scripts/sound_blocks.js"></script>   <!--这是增加的代码行-->
<script src="scripts/main.js"></script>

然后在sound_blocks.js中添加如下代码

Blockly.defineBlocksWithJsonArray([
    {
        "type": "play_sound",
        "message0": "Play %1",
        "args0": [
        {
            "type": "field_dropdown",
            "name": "VALUE",
            "options": [
            ["C4", "sounds/c4.m4a"],
            ["D4", "sounds/d4.m4a"],
            ["E4", "sounds/e4.m4a"],
            ["F4", "sounds/f4.m4a"],
            ["G4", "sounds/g4.m4a"],
            ["A5", "sounds/a5.m4a"],
            ["B5", "sounds/b5.m4a"],
            ["C5", "sounds/c5.m4a"]
            ]
        }
        ],
        "previousStatement": null,
        "nextStatement": null,
        "colour": 355
    }
]);

以上js代码定义了类型为play_sound的代码块,还需要把它加入到html页面中才能显示

<div id="blocklyDiv" style="height: 480px; width: 400px;">
    <xml id="toolbox" style="display: none">
      <block type="controls_repeat_ext">
        <value name="TIMES">
          <shadow type="math_number">
            <field name="NUM">5</field>
                </shadow>
            </value>
        </block>
        <block type="play_sound"></block>   <!-- 这是新增加的代码行 -->
    </xml>
  </div>

再次刷新浏览器,打开工具箱发现多了一个红色的代码块,该代码块可以用来播放sounds目录的声音文件

play_sound代码块

保存/加载工作区

现在构建好了需要的代码块,已经可以在代码编辑区进行编写了,接下来需要做的是保存和加载功能。

编辑scripts/main.js,save方法中增加如下代码,改代码实现用户点击保存是将工作区的代码块保存为xml格式

function save(button) {
    // 增加的代码行
    button.blocklyXml = Blockly.Xml.workspaceToDom(Blockly.getMainWorkspace());
  }

保存成功后,下次进入点击数字进入工作区还需要将工作区的代码块加载出来,继续编辑main.js,增加如下方法

// 增加的代码 --- start
function loadWorkspace(button) {
    let workspace = Blockly.getMainWorkspace();
    workspace.clear();
    if (button.blocklyXml) {
      Blockly.Xml.domToWorkspace(button.blocklyXml, workspace);
    }
  }
// 增加的代码 --- end

function enableBlocklyMode(e) {
    document.body.setAttribute('mode', 'blockly');
    currentButton = e.target;
    loadWorkspace(currentButton);   // 这一行是增加的代码
  }

现在尝试刷新浏览器,点击edit进入编辑模式,点击指定数字进行代码块编辑后点击save保存,然后再次返回后工作区仍然保留了上次编辑的代码块。

image

保存工作区

生成JavaScript代码

编辑scripts/sound_blocks.js,增加如下代码

Blockly.JavaScript['play_sound'] = function(block) {
  let value = '\'' + block.getFieldValue('VALUE') + '\'';
  return 'MusicMaker.queueSound(' + value + ');\n';
};

这段代码的会将play_sound代码块生成如下js代码"MusicMaker.queueSound('Sounds/c4.m4a');"(注:这里展示的代码以C4选项为例)。

运行生成的JavaScript代码

编辑scripts/main.js,handlePlay方法中增加如下代码

function handlePlay(event) {
  // 增加的代码 -- start
  loadWorkspace(event.target);
  let code = Blockly.JavaScript.workspaceToCode(Blockly.getMainWorkspace());
  code += 'MusicMaker.play();';
  try {
    eval(code);
  } catch (error) {
    console.log(error);
  }
  // 增加的代码 -- end
}

现在music maker的app就全部完成,重新刷新浏览器,点击edit进入编辑模式,然后点击不同的数字进行编程,可以根据代码块的提示设置播放什么声音,播放的次数,编辑完成后点击Done就进入运行模式,此时点击相应的数字就会播放音乐了,还是蛮好玩的,快试试吧。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,179评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,229评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,032评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,533评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,531评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,539评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,916评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,813评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,568评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,654评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,354评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,937评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,918评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,152评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,852评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,378评论 2 342

推荐阅读更多精彩内容