使用PyObjC和Interface Builder的IBOutlet

2 投票
2 回答
1042 浏览
提问于 2025-04-15 16:54

我正在用Python和PyObjC写一个简单的OSX应用程序。我用Interface Builder设计了设置对话框,然后用ibtool把它编译,再从Python加载。现在的问题是,如何从Python代码中访问这个窗口里的控件呢?我之前玩过一点iPhone开发,记得在控制器类里需要有一个IBOutlet,这个IBOutlet要和Interface Builder里的UI控件连接起来。在Python中应该像这样:

class MyClass(NSObject):
  my_outlet = objc.IBOutlet('my_outlet')

但是因为我不是在XCode里工作(我只有一个.py文件和一个.xib文件),所以Interface Builder并不知道我的outlets。我该怎么在这种情况下进行绑定呢?或者还有什么其他方法可以从代码中访问UI元素?

2 个回答

1

我还没试过这个,不过你可以直接在界面构建工具(IB)里定义连接点。打开库面板,在顶部的分段控制中选择“类”,然后选择你想要定义连接点的自定义类。假设你有一个叫做 MyWindow 的 NSWindow 子类。找到列表中的 NSWindow 类,点击左下角的操作按钮,选择“新建子类...”,然后命名为 MyWindow。接着切换到“连接点”标签,给你的窗口创建一个 NSButton 的连接点。然后你就可以把一个按钮连接到这个连接点上了。

我不知道这个在 PyObjC 中会怎么实现,但我很想知道你尝试后得到的结果。

4

首先,使用Xcode与NIB文件的加载没有直接关系,只是让操作更方便而已。

正如Ole所说,你可以使用Interface Builder(IB)手动将你需要的连接(outlet)添加到文件的拥有者或者NIB文件中自定义对象的实例上。这样做的话,一切就会“正常运作”。

不过,这句话让我想到了我之前的一个相似回答:

我只有一个.py文件和一个.xib文件。

你是在尝试在一个.app的外部写一些用户界面代码吗?如果是这样的话,这种做法是完全不被支持的,正确实现起来非常困难,而且很可能在软件更新或重大版本发布时出现问题(过去已经发生过很多次)。

解决你问题的最好方法是使用Xcode项目,构建一个标准的应用程序。现在开发工具中不再附带模板,你需要单独下载它们。

如果你需要从命令行运行它,还是可以做到的。

撰写回答