views:

101

answers:

2

I'm writing a simple OSX app using Python and PyObjC. I designed the settings dialog using Interface Builder and I use ibtool to compile it, then load it from Python. The problem is how to access the controls I have in this window from the Python code? I played around with iPhone development a bit before and I remember I need to have an IBOutlet in the controller class which will be connected to the UI control in the interface builder. It should look something like this in Python:

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

But since I'm not working in XCode (all I have is a .py file and a .xib file), Interface Builder doesn't know about my outlets. How can I do the binding in this case? Or how else can I access the UI elements from the code?

+1  A: 

I haven't tried this, but you can also define outlets directly in IB. Open the Library panel, select Classes in the segmented control at the top and select your custom class you want to define an outlet for. Let's say you have a NSWindow subclass called MyWindow. Select the NSWindow class in the list, click on the action button at the bottom left, select New Subclass... and name it MyWindow. Now switch to the Outlets tab and create a NSButton outlet for your window. Now you connect a button to the outlet.

I don't know how this will transfer to PyObjC but I'd love to see your results when you try it out.

Ole Begemann
+3  A: 

First, the use of Xcode or not has nothing to do with NIB loading (beyond making it more convenient).

As Ole said, you can use IB to manually add the outlet's you need to file's owner or to the custom object instances that you have in the NIB file. By doing so, it will all "just work".

However, this statement is what prompted my relatively similar answer:

all I have is a .py file and a .xib file

Are you trying to write a bit of UI code outside of a .app wrapper? If so, that is a wholly unsupported pattern, very difficult to get correct, and quite likely to break across software updates or major releases (as it has many times in the past).

The best way to solve your problem is to use an Xcode project and build a standard application. The templates are no longer shipped with the dev tools. Just download them separately.

If you need to run it from the command line, you can still do so.

bbum
Hmm... Saw some tutorials on XCode + PyObjC, but the templates being removed in the last XCode I thought it's not being supported anymore or something, so I just went on with Emacs + Interface Builder. :) Yes, I *do* want an .app, so I'm going to switch to XCode. Thanks a lot for the insightful answer.
ionut bizau