Ошибка «Невозможно найти класс: TKApplication, выход» при попытке использовать Tkinter внутри существующего приложения Какао - PullRequest
1 голос
/ 08 апреля 2019

Требование

Мне нужно использовать Tkinter в экземпляре Python, который встроен в существующее приложение с графическим интерфейсом Cocoa.

Что я пробовал

В Windows это было так же просто (затенение много деталей), как создание Python в виде библиотеки, создание ссылок на нее и библиотеки Tcl / Tk, загруженные процессом сборки Python, а затем вызов Tkinter из C API Python и из встроенного кода Python.

Следуя той же общей идее для Mac, я создал (статические) библиотеки Python, Tcl и Tk, используя стандартный процесс Unix configure / make / make install. Это позволяет мне одновременно использовать Tkinter в исполняемом исполняемом файле Python и запускать код Python внутри моего приложения, но когда я пытаюсь вызвать Tkinter в своем приложении (с вызовом tkinter.Tk(), я получаю Objective-C исключение:

[NSApplication _setup:]: unrecognized selector sent to instance 0x6040001018c0

Из прочтения документации Tk кажется, что Cocoa Tkinter работает путем создания подкласса NSApplication, код для которого можно найти в tkMacOSXPrivate.h :

@interface TKApplication : NSApplication {

Следовательно, ошибка возникает из-за того, что мое приложение не использует этот подкласс, поэтому, когда TkpInit функция Tk запускает следующий код , объект, возвращаемый sharedApplication, является NSApplication, а не TKApplication * * 1030

[TKApplication sharedApplication];
[NSApp _setup:interp];

В соответствии с NSApplication документацией , исправление для этого состоит в том, чтобы просто установить «класс пользовательского приложения в качестве основного класса», заменив «NSApplication» в поле Principal Class именем вашего пользовательского класса »(т.е. установка NSPrincipalClass в приложении Info.plist.

Однако после этого я получаю следующую ошибку при запуске приложения:

Unable to find class: TKApplication, exiting

Кажется, что Какао не может найти класс, который определен в библиотеке tk, которую я построил.

Вопросы:

  1. Является ли это правильным подходом для использования Tkinter из экземпляра Python, находящегося в выходящем приложении GUI?

  2. Почему Какао не может найти класс TKApplication?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...