4

我的计划:

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

当前情况:[已修复...见更新2]

我已经包含了所有需要的 python 模块,但我仍然得到一个

Library 'GL' not found

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

要求:

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

我的问题:

我的问题是否有某种解决方法或库文件夹不匹配的修复方法。已阅读有关但找不到好的解决方案的一些Tao-Opengl文章OpenTK

更新1:

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

示例代码 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);

示例代码 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)

更新2:

第 139 行 [pyglet/lib.py] sys.platform is not win32... 出现错误。仅使用以下行来修复它:

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

现在出现以下错误:

'module' object has no attribute '_getframe'

修复它有点痛苦。正在更新结果...

更新3:

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

setup.Options["Frames"] = true;

当前问题:

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

更新4:

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

当前问题:

'libGL.so not found'...伙计们..我几乎放弃了nodebox for C#..待续

更新5:

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

4

1 回答 1

0

-X:Frames 启用框架选项作为运行时(它会减慢代码的速度,以便始终访问 Python 框架)。

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

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

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

于 2011-01-05T02:59:57.847 回答