#!/usr/bin/env pythonw
# HelloWorld.py
#
# The original PyObjC interface example by Steve Majewski.
#
# A quick guide to runtime name mangling:
#
# ObjC becomes Python
# [ obj method ] obj.method()
# [ obj method: arg ] obj.method_(arg)
# [ obj method: arg1 withOtherArgs: arg2 ]
# obj.method_withOtherArgs_( arg1, arg2 )
###
### NOTE: This is no longer the recommended way to build applications
### using the pyobjc bridge under with OS X. In particular, applications
### work much better if they are constructed in a proper app wrapper.
###
### This app does demonstrate that it is possible to build full
### featured Cocoa apps without InterfaceBuilder.
###
import objc
from Foundation import *
from AppKit import *
from PyObjCTools import AppHelper
class AppDelegate (NSObject):
def applicationDidFinishLaunching_(self, aNotification):
print "Hello, World!"
def sayHello_(self, sender):
print "Hello again, World!"
def main():
app = NSApplication.sharedApplication()
# we must keep a reference to the delegate object ourselves,
# NSApp.setDelegate_() doesn't retain it. A local variable is
# enough here.
delegate = AppDelegate.alloc().init()
NSApp().setDelegate_(delegate)
win = NSWindow.alloc()
frame = ((200.0, 300.0), (250.0, 100.0))
win.initWithContentRect_styleMask_backing_defer_ (frame, 15, 2, 0)
win.setTitle_ ('HelloWorld')
win.setLevel_ (3) # floating window
hel = NSButton.alloc().initWithFrame_ (((10.0, 10.0), (80.0, 80.0)))
win.contentView().addSubview_ (hel)
hel.setBezelStyle_( 4 )
hel.setTitle_( 'Hello!' )
hel.setTarget_( app.delegate() )
hel.setAction_( "sayHello:" )
beep = NSSound.alloc()
beep.initWithContentsOfFile_byReference_( '/System/Library/Sounds/Tink.Aiff', 1 )
hel.setSound_( beep )
bye = NSButton.alloc().initWithFrame_ (((100.0, 10.0), (80.0, 80.0)))
win.contentView().addSubview_ (bye)
bye.setBezelStyle_( 4 )
bye.setTarget_ (app)
bye.setAction_ ('stop:')
bye.setEnabled_ ( 1 )
bye.setTitle_( 'Goodbye!' )
adios = NSSound.alloc()
adios.initWithContentsOfFile_byReference_( '/System/Library/Sounds/Basso.aiff', 1 )
bye.setSound_( adios )
win.display()
win.orderFrontRegardless() ## but this one does
AppHelper.runEventLoop()
if __name__ == '__main__' : main()
|