Skulpt 的 Pygame module 遇到的几个问题

383 阅读1分钟

1、Skulpt 版本不同导致 引入方式不同 两个版本有一点不同,导致 Pygame module 的github 文档 使用方法 失效

Sk.externalLibraries 为什么会失效了 在新版的时候弃用了 Sk.externalLibraryCache 方法去加载 externalLibraries 的文件代码。

那新版的Skulpt.js 必定要处理 模块的 引入问题 ==》 简化成 import pygame 怎么处理的

  1. Sk.importModule(name, dumpJS, canSuspend) 

  2.  Sk.importModuleInternal_ (name, dumpJS, undefined, undefined, undefined, false, canSuspend)

  3. Sk.importSearchPathForName(searchFileName, ".js", searchPath)

  4. Sk.read(filename)

主要是通过Sk.importModuleInternal_ 可以处理  

Sk.importModule("pygame.display", false, false);

模块名为 pygame.display  在父节点上向上递归,导入pygame

Sk.importSearchPathForName 的 searchFileName 其实就是  pygame 和 pygame.display

再去调用   Sk.read(’src/lib/pygame.js‘)  该函数  Sk.read(x) 会去 Sk.builtinFiles.files对象取相应的值。在skulpt-stdlib.js上配置 Sk.builtinFiles.files = { "src/lib/turtle.js":code.js}

正常情况下 当调用 Sk.importModule("pygame.display", false, false); 的时候,在没有在加载pygame的情况下会去在加载一次pygame这个模块,再去加载 pygame下的display 模块。也就是说 程序应该  Sk.read(’src/lib/pygame.js‘) 再去 Sk.read(’src/lib/pygame/display.js‘)这才是合理的情况。 pygame.display =>pygame/display

但是 Skulpt.js 运行的结果确实  程序应该 Sk.read(’src/lib/pygame.js‘) 再去读取 Sk.read(’src/lib/pygame/display.js‘)。如果 和 Sk.builtinFiles.files的模块不起冲突一切正常。

但是当 pygame 的模块 和   skulpt-stdlib.js上配置的基础模块(他们都一个time的模块)  有冲突 就会导致程序异常了。

所以源码 处理 Sk.importModule("pygame.display", false, false) 这个的时候 应该 Sk.read(’src/lib/pygame.js‘) 再去 Sk.read(’src/lib/pygame/display.js‘)。

那为什么源码不是这样子处理的???

这句代码导致 searchFileName 原本pygame.display 变成 display 导致了 Sk.read(’src/lib/pygame.js‘) 再去读取 Sk.read(’src/lib/display.js‘)这个流程 。

但是 在 importSearchPathForName 这个方法中 name 参数进行 处理 

pygame.display  转换成  pygame/display

大胆推测:

searchFileName = modNameSplit[modNameSplit.length-1];

这个代码是可以去掉。

运行python 的代码 模块的导入和模块之前重名的问题 都解决了