繁体   English   中英

C#中的IronPython和Nodebox

[英]IronPython and Nodebox in C#

我的计划:

我正在尝试设置我的C#项目与Nodebox通信以调用某个函数,该函数填充图形并在新窗口中绘制它。

现状:[修复...见Update2]

我已经包含了所有需要的python-modules,但我仍然得到了

Library 'GL' not found

似乎pyglet模块需要引用GL/gl.h ,但由于IronPython行为而无法找到它。

需求:

在不安装新软件包的情况下,项目需要尽可能小。 这就是为什么我将我的所有模块复制到项目文件夹中并希望保持它或类似的方式。

我的问题:

是否有针对我的问题的某种解决方法或库文件夹错误的修复。 已经阅读了一些关于Tao-OpenglOpenTK文章,但找不到一个好的解决方案。

UPDATE1:

使用一个小的pyglet窗口渲染示例更新了我的源代码。 问题出在pyglet和引用的c-Objects中。 我如何将它们包含在我要调用的c#项目中? 到目前为止还不知道......现在正在试验。 保持更新。

SampleCode C#:

ScriptRuntimeSetup setup = Python.CreateRuntimeSetup(null);
ScriptRuntime runtime = new ScriptRuntime(setup);
ScriptEngine engine = Python.GetEngine(runtime);

ScriptSource source = engine.CreateScriptSourceFromFile("test.py");
ScriptScope scope = engine.CreateScope();
source.Execute(scope);

SampleCode Python(test.py):

from nodebox.graphics import *
from nodebox.graphics.physics import Vector, Boid, Flock, Obstacle

flock = Flock(50, x=-50, y=-50, width=700, height=400)
flock.sight(80)

def draw(canvas):
    canvas.clear()
    flock.update(separation=0.4, cohesion=0.6, alignment=0.1, teleport=True)
    for boid in flock:
        push()
        translate(boid.x, boid.y)
        scale(0.5 + boid.depth)
        rotate(boid.heading)
        arrow(0, 0, 15)
        pop()

canvas.size = 600, 300

def main(canvas):
    canvas.run(draw)

UPDATE2:

第139行[pyglet / lib.py] sys.platform不是win32 ...有错误。 通过使用该行修复它:

from pyglet.gl.lib_wgl import link_GL, link_GLU, link_WGL

现在出现以下错误:

'module' object has no attribute '_getframe'

有点痛苦要解决它。 更新结果...

UPDATE3:

通过在C#-Code中的第一行之后添加以下行来修复:

setup.Options["Frames"] = true;

当前问题:

No module named unicodedata ,但在Python26/DLLs中只是一个*.pyd `。 那么..我现在如何实现它?!

UPDATE4:

通过冲浪修复: 链接文本并将unicodedata.py'.pyd添加到C#Projectfolder。

当前问题:

'libGL.so not found'...伙计们...我几乎放弃了节点盒的C#..继续

Update5:

我放弃了:/ workaround:c#通过xml和filesystemwatchers与nodebox进行通信。 不是最佳的,但案例已解决。

-X:Frames使frame选项成为运行时(它会使代码慢一点,以便始终可以访问Python帧)。

要在托管时启用框架,您只需执行以下操作:

ScriptRuntimeSetup setup = Python.CreateRuntimeSetup(new Dictionary<string, object>() {
    { "Frames", true }
});

而不是你现在传递的null。 这只是为选项字典创建一个新的字典,其内容“Frames”设置为true。 您也可以在其中设置其他选项,通常-X:Name选项与命令行相同。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM