c# - C# 中的 IronPython 和 Nodebox

标签 c# python opengl ironpython nodebox

我的计划:

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

当前情况:[已修复...参见 Update2]

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

Library 'GL' not found

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

要求:

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

我的问题:

我的问题是否有特定的解决方法或库文件夹不匹配的修复程序。 看过一些关于Tao-OpenglOpenTK的文章,但找不到好的解决方案。

更新 1:

用一个小的 pyglet 窗口渲染示例更新了我的源代码。问题出在 pyglet 和引用的 c 对象中。我如何将它们包含在我要调用的 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 不是 win32...有错误。仅使用以下行修复它:

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

现在出现以下错误:

'module' object has no attribute '_getframe'

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

更新3:

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

setup.Options["Frames"] = true;

当前问题:

没有名为 unicodedata 的模块,但在 Python26/DLLs 中只有一个 *.pyd 文件`。那么..我现在该如何实现?!

更新4:

通过浏览修复:link text并将 unicodedata.py'.pyd 添加到 C# Projectfolder。

当前问题:

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

更新5:

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

最佳答案

-X:Frames 启用 frames 选项作为运行时(它会稍微降低代码速度以便始终访问 Python 框架)。

要在托管时启用框架,您只需要做:

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

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

关于c# - C# 中的 IronPython 和 Nodebox,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4579210/

相关文章:

c# - .NET 智能感知 : 2 projects in one solution

Opengl - glDrawBuffers 修改是否存储在 FBO 中?不?

c++ - 如何将类方法作为 GLUT 回调传递?

qt - 如何在 OpenGL 中使用顶点缓冲区对象和顶点数组?

c# - 在 web/api 应用程序中连接到 Cassandra 的正确方法

c# - 在不指定默认值的情况下创建 'NOT NULL' SQLite 列

python - MongoDB中的内存错误

python - python中奇点的数值积分(主值)

python - Tensorflow 不开始训练

c# - 如何在c#中运行exe文件