Требование
Мне нужно использовать 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, которую я построил.
Вопросы:
Является ли это правильным подходом для использования Tkinter из экземпляра Python, находящегося в выходящем приложении GUI?
Почему Какао не может найти класс TKApplication?