我需要在嵌入到现有Cocoa GUI应用程序内部的Python实例中使用Tkinter。
在Windows上,这就像将Python构建为一个库,将其与Python的构建过程中下载的Tcl / Tk库进行链接,然后调用时一样简单(对细节进行详细处理) Tkinter来自Python的C API和嵌入式Python代码。
在Mac上遵循相同的一般思想,我使用标准的Unix configure
/ make
/ make install
进程构建了(静态)Python,Tcl和Tk库。这使我既可以在同时构建的Python可执行文件中使用Tkinter,又可以在我的应用程序中运行Python代码,但是当我尝试在我的应用程序中调用Tkinter时(通过调用tkinter.Tk()
可以得到一个目标-C例外:
[NSApplication _setup:]: unrecognized selector sent to instance 0x6040001018c0
通过阅读Tk文档,可可Tkinter似乎可以通过继承NSApplication
来工作,可以在tkMacOSXPrivate.h中找到其代码:
@interface TKApplication : NSApplication {
由于我的应用未使用此子类,因此发生错误,因此当Tk的TkpInit
函数运行following code时,sharedApplication
返回的对象是NSApplication
,不是TKApplication
:
[TKApplication sharedApplication];
[NSApp _setup:interp];
根据NSApplication
documentation,此问题的解决方法是简单地设置“您的自定义应用程序类为主体类”,方法是将“主体类”字段中的““ NSApplication”替换为您的自定义类的名称” (即在应用程序的NSPrincipalClass
中设置Info.plist
。
但是,这样做之后,我在应用启动时遇到了以下错误:
Unable to find class: TKApplication, exiting
似乎可可找不到我建立的tk库中定义的类。
这是在退出的GUI应用程序内部的Python实例中使用Tkinter的正确方法吗?
可可为什么找不到TKApplication类?