gpt4 book ai didi

python - 如何创建 Cocoa 库并在 python 中使用它

转载 作者:太空宇宙 更新时间:2023-11-03 19:36:50 27 4
gpt4 key购买 nike

我一直在制作一个游戏,但我使用的 python 库(Pyglet)很糟糕。我想尝试在 OSX 版本中使用 Cocoa。

我将能够弄清楚如何使用 NSWindow 和 NSOpenGLView 等类中的对象,然后将这些对象放入我自己的类中以进行游戏循环。

我不知道如何使用 PyObjC 加载我可以制作的动态 Objective-C 库,然后使用我将在 python 中制作的类来设置我认为可以由 NSTimer 循环的游戏。

但是,循环方法还需要从许多 python 类之一调用 python 方法。我的游戏由许多 python 类组成,这些类用于游戏的不同部分(Mapmaker、GameSession、AnacondaGame 等)。游戏循环需要根据当前部分调用任何这些类中的循环方法并传递信息。

PyObjC 显然是“双向的”,那么这是如何完成的?

或者,我可以创建两个由 py​​thon 调用的方法,并在中间添加 python 代码,其中循环由 python 控制。

PyObjC 网站上的“文档”似乎只解释了如何在 python 中使用 Cocoa,没有其他内容。

我不能做的是使用界面构建器制作一个固定的 GUI,因为该库需要根据我的类的初始化方法的 python 输入创建窗口。

了解 Objective-C 的语法并不是一个大问题,我可以引用 Cocoa 文档来制作我需要的对象。

感谢您的帮助。我们将非常感激。我厌倦了使用 pygame 和 pyglet 等损坏的库,使用特定于平台的操作系统 API 似乎是确保质量的最佳方法。

最佳答案

PyObjC 将 Python 与 Objective-C 运行时桥接起来,因此,如果您在 Python 中创建 NSObject 子类,则可以从同一进程中运行的 Objective-C 代码访问它们。这意味着您需要将所有 Python 功能封装在 NSObject 的子类中,您可以通过桥访问该子类。

我这样做的方法是在 Objective-C 端有一个单例 Controller 类,它有一个类似 -(void)pythonReady:(PythonClass *)pythonObject 的方法,并且还处理Python 代码的加载(这确保加载 Python 代码时 Controller 类存在)。然后,在 Python 代码中,创建 PythonClass 的实例后,您可以在 Controller 单例上调用 pythonReady:。然后,在 Objective-C 端的 pythonReady: 中,您可以调用 pythonObject 上所需的任何方法,这将在 Python 端运行代码。

要从 Controller 类加载 Python 代码,您可以执行以下操作:

#import <Python/Python.h>

@implementation PythonController (Loading)
- (void)loadPython {
NSString *pathToScript = @"/some/path/to/script.py";
setenv("PYTHONPATH", [@"/some/path/to/" UTF8String], 1);
Py_SetProgramName("/usr/bin/python");
Py_Initialize();
FILE *pyScript = fopen([pathToScript UTF8String], "r");
int result = PyRun_SimpleFile(pyScript, [[pathToScript lastPathComponent] UTF8String]);
if (result != 0) { NSLog(@"Loading Python Failed!"); }
}
@end

基本上,我们只是使用 Python C API 在当前进程内运行脚本。该脚本本身启动了当前进程中运行时的桥梁,然后您可以在其中使用 Cocoa API 访问您的 Controller 单例。

关于python - 如何创建 Cocoa 库并在 python 中使用它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3171650/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com