Re: [Pyobjc-dev] import Quartz in 10.5 Xcode Project headache
Brought to you by:
ronaldoussoren
From: Chris B. <qu...@me...> - 2010-02-02 22:10:10
|
I'm having some trouble getting your workaround to function as well; the application launches properly if I take the Quartz import out of the global scope and put it in my method or in applicationDidFinishLaunching_, but the animation is still not working... Allow me to demonstrate: import objc from Foundation import * class ShakeDemo(NSObject): window = objc.IBOutlet() def applicationDidFinishLaunching_(self, sender): import Quartz NSLog("Application did finish launching.") @objc.IBAction def shake_(self, sender): import Quartz shake = {'count': 4, 'duration': 0.5, 'vigor': 0.05} shakeAnim = Quartz.CAKeyframeAnimation.animation() shakePath = Quartz.CGPathCreateMutable() frame = self.window.frame() Quartz.CGPathMoveToPoint(shakePath, None, NSMinX(frame), NSMinY(frame)) shakeLeft = NSMinX(frame) - frame.size.width * shake['vigor'] shakeRight = NSMinX(frame) + frame.size.width * shake['vigor'] for i in range(shake['count']): Quartz.CGPathAddLineToPoint(shakePath, None, shakeLeft, NSMinY(frame)) Quartz.CGPathAddLineToPoint(shakePath, None, shakeRight, NSMinY(frame)) Quartz.CGPathCloseSubpath(shakePath) # Use KVO to set the path and duration since we "can't change a method" shakeAnim._['path'] = shakePath shakeAnim._['duration'] = shake['duration'] self .window .setAnimations_(NSDictionary.dictionaryWithObject_forKey_(shakeAnim, "frameOrigin")) self.window.animator().setFrameOrigin_(frame.origin) if __name__ == "__main__": from PyObjCTools import AppHelper AppHelper.runEventLoop() This works perfectly on Snow Leopard, but when I run it on Leopard the window disappears after the shake_ action (its frame turns into NSZeroRect rather than animating as far as I can tell). Obviously, ShakeDemo.window outlet is wired to the window in the xib, as is the shake_ action, so I've attached a project file below so you can try for yourself. On Feb 2, 2010, at 2:31 PM, Orestis Markou wrote: > This is a known issue, though I've no idea whose bug it is. > > The workaround is to put any Quartz-related imports in a place where > they are reached *after* the application launches, > such as applicationDidFinishLaunching_. If you're doing a lot of > work you might move them to an external file to make life easier. > > Orestis > > On 2 Feb 2010, at 21:14, Chris Bonhage wrote: > >> I'm trying to use Quartz in my Xcode template-based PyObjC >> application >> to do a window shake animation; everything works great in Snow >> Leopard. When I go about testing it on Leopard systems, some bad >> stuff >> happens at application launch, the dock icon bounces continuously, >> and >> the console barfs up this nonsense before quieting down and doing >> nothing at all: >> >> _RegisterApplication(), FAILED TO establish the default connection to >> the WindowServer, _CGSDefaultConnection() is NULL. >> *** -[NSRecursiveLock unlock]: lock (<NSRecursiveLock: 0x1d66300> >> '(null)') unlocked when not locked >> *** Break on _NSLockError() to debug. >> NSInternalInconsistencyException - Error (1002) creating CGSWindow >> >> This issue doesn't occur if the import occurs after >> AppHelper.runEventLoop() gets called, but the resulting calls to >> Quartz don't appear to be functioning properly, as the window does >> not >> shake and in fact disappears, changing its frame to NSZeroRect for >> every frame of the key-animation. >> >> I've tested this import issue on a clean Xcode project from the >> template and it occurs, but the internets at large have little to say >> about the matter outside of the py2app realm. Any thoughts/ >> workarounds? The fact that this works just fine on Snow Leopard leads >> me to believe that this is a bug with PyObjC in Leopard, but I really >> hope not. |