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

2024-04-20 03:47:02 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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

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

PyObjC显然是“双向”的,那是怎么做到的呢?在

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

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

我做不到的是用interfacebuilder创建一个固定的GUI,因为库需要基于python输入来创建类的初始化方法。在

了解Objective-C的语法并不是一个大问题,我可以查阅Cocoa文档来生成我需要的对象。在

谢谢你的帮助。我们将不胜感激。我讨厌使用像pygame和pyglet这样的破库,使用特定于平台的OS api似乎是确保质量的最佳方法。在


Tags: 对象方法文档版本loop游戏动态pyobjc
1条回答
网友
1楼 · 发布于 2024-04-20 03:47:02

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

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

要从控制器类加载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

基本上,我们只需使用pythoncapi在当前进程中运行脚本。脚本本身启动到当前进程中运行时的桥,然后可以使用cocoaapi访问控制器singleton。在

相关问题 更多 >