- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章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文件.
需要对每个block定义生成的代码.
block是根据type来区分的,每个block的type是唯一的。scratch-blocks的基本blocks的定义是在scratch-blocks\blocks_vertical目录里。 具体可以查阅之前的博客《scratch3.0二次开发之scratch-blocks中的blocks的类型、定义和使用方法》 。
以下是一个type为“motion_movesteps”的block块的定义 。
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'
;
};
|
根据参数的类型,选择blockly.python.valuetocode、block.getfieldvalue还是blockly.python.statementtocode来获取值.
。
type类型 | 方法 |
---|---|
input_value | blockly.python.valuetocode |
input_statement | blockly.python.statementtocode |
field_* | block.getfieldvalue |
这是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的类型 |
---|---|
字符串 | |
字符串 | |
[code, order] 数组 | |
[code, order] 数组 |
引入模块:blockly.python.definitions_[模块名] = ”import xxxx"; 声明函数:blockly.python.definitions_[模块名] = ”def xxx …"; 。
在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 。
最后此篇关于scratch3.0二次开发之用blocks生成python代码的文章就讲到这里了,如果你想了解更多关于scratch3.0二次开发之用blocks生成python代码的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
互联网上到处都是他们创建云变量的示例/教程。但是当我创建一个变量(我使用了scratch 2和3)时,我得到了 但我想得到的是: 我刚刚看了一个 youtube 教程,其中被告知要使云正常工作,您必须
我正在使用 Scratch 1.4 为 child 准备类(class)。 本类(class)是关于控制真实设备(自制交通信号灯、 retrofit 有电机、传感器等的玩具) 为了连接硬件,我使用远程
我正在和我的 child 一起阅读一本“用 Scratch 学习编程”的书。其中一项练习是要求创建一个使用一些简单公式的“功能块”。他们没有在书中解释什么是“功能块”,否则我可能会错过。我也找不到任何
我需要构建 Scratch 中使用的编程 block 的迷你版或稍后!或开放 block 。 它们中的代码都很大而且很难理解,尤其是在 Scratch 中,它是用 SmallTalk 的某种子集编写的
我想知道是否有一种简单的方法可以打开一个 .txt 文件并将一些逗号分隔的数据加载到 Scratch 中的变量中,然后将一些变量数据从 Scratch 添加到一个 .txt 文件或类似文件中? 我已经
我儿子对 ROT-13 密码感兴趣。我想帮助他在 MIT Scratch 中编写一个程序,该程序可以将字符串作为输入并返回 ROT-13 编码的文本作为输出。为此,程序需要取出字符串,分离出所有字符,
在 Scratch 2.0 中,添加了对自定义堆栈 block (procedures) 的支持。但是有什么方法可以使用它来“抽象掉”返回值的逻辑吗? 例如,我这里有一个简单计算指数的脚本:( vie
我有一个 multiplayer project它有一些永远的循环,其中包含检查代码。 问题是,由于变量 dvotes、uvotes 滞后,多台计算机可能会处理此问题并更改 crabx 或 craby
我可以阻止某个脚本中的代码在另一个脚本中运行吗?我知道有一个停止 block ,但您只能停止当前脚本、所有其他脚本或所有脚本。 最佳答案 这里有一个解决方法:创建另一个隐藏的 Sprite ,其中只有
我正在为 MIT Scratch 中的教育编写一个简单的游戏,并想让一个 Sprite 转向另一个 Sprite (想想我们的英雄飞船后面的一艘外星飞船)。我可以轻松地让外星飞船指向英雄: point
我尝试从头开始编写Bridson 的泊松圆盘采样算法,它似乎是一些副作用或我找不到的错误。你能帮帮我吗? 这是我的尝试: My try online. Some explanation on the
在我的小狗沙龙项目中,我在到达项链部分时遇到了问题。我希望所有未使用的项链在收到消息 m11 时消失,但保留小狗身上的项链。然而,现在所有的项链都不见了。 这是将项链分配给小狗时运行的代码: 这会将它
我希望我的学生使用 Scratch 的衍生产品 Enchanting 对 Mindstorm NXT 机器人进行编程,以驱动预先编程的类(class),沿着路线行驶并避开障碍物。 (二态、五态和比例线
Error Image 我的一位学生正在 Mac 上使用 IntelliJ 中的处理。我们使用与我在 PC 上使用的相同步骤进行设置(适用于我的 PC),但现在它给我一个错误,指出文件名应该是 Scr
大家好,我是IT共享者,人称皮皮。 前言 Scratch作为少儿编程的首选编程语言,这几年发展的如火如荼,当然,这主要还是因为它简单易学,不用掌握太多概念即可编程,这意味着你不用认识英文单词
我有这个代码: 但是每当 shoot 消息被发送到 bullet Sprite ,并且舞台上有一个克隆人还没有击中它的目标时,克隆人就会与 go to x: (xOfTower) y: (yOfTow
我正在从头开始创建一个迷你家庭游戏,我使用随机选择块在 1 到 27 之间进行选择。我有 27 个背景,上面写着 1 到 27 个数字。但是我注意到在大约 21-22 个数字之后,随机选择器无法选择任
我注意到永远(或重复())循环在迭代之间需要时间(没有“等待()秒”块)。这究竟是多久? 最佳答案 使用此代码进行测试: 每次迭代平均为 0.000000994 秒,因此在处理时间之外似乎没有故意延迟
我的目标是构建 5x5 的图像网格。在以下代码中,row、col 和 rowcol 被创建为 Sprite 的本地变量,以及 newcol, newrow 和 cats 是全局的。 (顺便问一下,是否
我正在 Scratch 上制作一个桨球游戏(只是为了好玩),但我的计分遇到了问题。如果你想看我已经写的代码,游戏链接是https://scratch.mit.edu/projects/66541388
我是一名优秀的程序员,十分优秀!