尝试在现有Cocoa应用程序中使用Tkinter时出现错误“无法找到类:TKApplication,正在退出”

时间:2019-04-08 11:10:56

标签: python tkinter

要求

我需要在嵌入到现有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库中定义的类。

问题:

  1. 这是在退出的GUI应用程序内部的Python实例中使用Tkinter的正确方法吗?

  2. 可可为什么找不到TKApplication类?

0 个答案:

没有答案