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.
|