Как создать библиотеку Какао и использовать ее в Python

1

Я делаю игру, и используемая мной библиотека python ужасна (Pyglet). Я хочу попробовать использовать Cocoa для версии OSX.

Я смогу выяснить, используя объекты из классов, таких как NSWindow и NSOpenGLView, а затем помещаю эти объекты в свой класс для игрового цикла.

Я понятия не имею, как я могу использовать PyObjC для загрузки динамической библиотеки Objective-C, которую я могу создать, а затем использовать класс, который я сделаю в python, чтобы настроить игру, которая, как я полагаю, может быть закодирована NSTimer.

Однако, метод цикла также должен будет вызвать метод python из одного из многих классов python. Моя игра состоит из многих классов python, которые используются для разных разделов игры (Mapmaker, GameSession, AnacondaGame и т.д.). Игровому циклу необходимо будет вызвать метод цикла в любом из этих классов в зависимости от текущего раздела и передать четную информацию.

PyObjC "двунаправленный", по-видимому, так, как это делается?

В качестве альтернативы я мог бы создать два метода, которые будут вызываться python, и я добавляю код python между ними, где цикл управляется python.

"Документация" на сайте PyObjC объясняет, как использовать Cocoa в python и ничего больше.

То, что я не могу сделать, это сделать фиксированный графический интерфейс с построителем интерфейса, потому что библиотеке нужно будет создавать окна на основе ввода python для метода инициализации моего класса.

Знание синтаксиса Objective-C не является большой проблемой, и я могу перенаправить на документацию Cocoa, чтобы сделать объекты, которые мне нужны.

Спасибо за любую помощь. Это будет очень признательно. Я устал от использования сломанных библиотек, таких как pygame и pyglet, с использованием специфичных для платформы API OS, кажется, лучший способ обеспечить качество.

  • 0
    Я не смогу использовать основной цикл Python? Мне нужно будет вызвать метод run в NSApplication, где Python готов к запуску. Затем мне нужно вызвать некоторые методы Python в моем коде Objective-C. К счастью, мой текущий код с pyglet использует аналогичную вещь, где вызывается метод run. Это просто вызывающий питон из Objective-C, который является раздражающей частью.
  • 0
    Конечно, должен быть хороший учебник для Какао без конструктора интерфейса?
Теги:
cocoa
pyobjc

1 ответ

1
Лучший ответ

PyObjC переводит Python в среду выполнения Objective-C, поэтому, если вы создаете подклассы NSObject в Python, они будут доступны из кода Objective-C, запущенного в том же процессе. Это означает, что вам нужно инкапсулировать все ваши функции Python в подкласс NSObject, доступ к которому можно получить через мост.

То, как я это сделаю, - это иметь класс контроллера singleton на стороне Objective-C, который имеет такой метод, как -(void)pythonReady:(PythonClass *)pythonObject, а также обрабатывает загрузку кода Python (что гарантирует, что класс контроллера существует, когда ваш Python-код загружен). Затем, в вашем коде Python, после создания экземпляра вашего PythonClass, вы можете вызвать pythonReady: на вашем контроллере singleton. Затем в pythonReady: на стороне Objective-C вы можете вызывать любые методы, которые вам нужны на 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

В принципе, мы просто используем API Python C для запуска script внутри текущего процесса. Сам script запускает мост для среды выполнения в текущем процессе, где затем вы можете использовать API Cocoa для доступа к контроллеру singleton.

  • 0
    Спасибо за информацию. Это может стать полезным. Я искал возможности загрузки динамической библиотеки во время выполнения с использованием PyObjC. Я могу проверить, сработает ли в первую очередь это, вероятно, будет более простым и элегантным решением. Но большое спасибо.
  • 0
    Использование «objc_getClass» с «dlopen» может очень хорошо работать.
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню