Re: [Pyobjc-dev] NSWindow
Brought to you by:
ronaldoussoren
From: Lawrence A. <la...@us...> - 2011-06-29 22:27:22
|
On 29 Jun 2011, at 23:04, Diez B. Roggisch wrote: > > On Jun 29, 2011, at 11:23 PM, Thomas Cool wrote: > >> Hello, >> I'm starting with PyObjC and am having some trouble creating windows >> I am not a beginner at either python or cocoa by the way. >> >> Here is what i am trying (both with macports python 2.6 and builtin python 2.6) on 10.6.8 >> >> from AppKit import * >> a=NSWindow.alloc().init() >> >> simply this returns an error: >> >> Wed Jun 29 16:23:09 TCi7.local python[10060] <Error>: kCGErrorInvalidConnection: CGSGetCurrentCursorLocation: Invalid connection >> Wed Jun 29 16:23:09 TCi7.local python[10060] <Error>: kCGErrorInvalidConnection: CGSNewWindowWithOpaqueShape: Invalid connection >> Traceback (most recent call last): >> File "<stdin>", line 1, in <module> >> objc.error: NSInternalInconsistencyException - Error (1002) creating CGSWindow > > > Let me guess, you just wrote that into a script, and executed it? > > It won't work in Objective-C either, if all you do is just to create a simple executable. > > Instead, you need to create an application bundle, using py2app. Otherwise, the window-server refuses to accept connections. I never really bothered to get to know the gory details, but see e.g. this discussion: > > http://stackoverflow.com/questions/3704629/why-cant-i-use-cocoa-classes-from-my-python-script > > And especially the related tech-note. > > Diez You need to create an application object first. Try something like this. #!/usr/bin/env python # encoding: utf-8 import sys import os # We need to import the relvant object definitions from PyObjC from AppKit import * from PyObjCTools import AppHelper # Cocoa prefers composition to inheritance. The members of an object's # delegate will be called upon the happening of certain events. Once we define # methods with particular names, they will be called automatically class Delegate (NSObject): def applicationDidFinishLaunching_(self, aNotification): '''Called automatically when the application has launched''' print "Hello, World!" def windowWillClose_(self, aNotification): '''Called automatically when the window is closed''' print "Window has been closed" # Terminate the application NSApp().terminate_(self) def main(): # Create a new application instance ... a=NSApplication.sharedApplication() # ... and create its delgate. Note the use of the # Objective C constructors below, because Delegate # is a subcalss of an Objective C class, NSObject delegate = Delegate.alloc().init() # Tell the application which delegate object to use. a.setDelegate_(delegate) # Now we can can start to create the window ... frame = ((200.0, 300.0), (250.0, 100.0)) # (Don't worry about these parameters for the moment. They just specify # the type of window, its size and position etc) w = NSWindow.alloc().initWithContentRect_styleMask_backing_defer_(frame, 15, 2, 0) # ... tell it which delegate object to use (here it happens # to be the same delegate as the application is using)... w.setDelegate_(delegate) # ... and set some properties. Unicode strings are preferred. w.setTitle_(u'Hello, World!') # All set. Now we can show the window ... w.orderFrontRegardless() # ... and start the application AppHelper.runEventLoop() if __name__ == '__main__': main() |