没有Xcode的PyObjC教程

6 投票
2 回答
3855 浏览
提问于 2025-04-16 11:48

我正在写一个小的跨平台wxPython应用,不过在每个平台上我都需要用到一些特定于该平台的API。在Mac OS上,可以通过PyObjC来实现。

我在找关于如何使用PyObjC的教程。但是到目前为止,我找到的都是关于Xcode的教程。我希望我的应用能够在mac、win和lin上运行,而不需要做任何修改,而且我不想在Xcode中开发。有没有什么办法呢?

更新:更具体一点,我需要在Mac OS X上访问一些手写板的事件,我想用PyObjC来实现这个功能(我没有看到其他的办法)。

2 个回答

0

你为什么需要Xcode?如果你是为了处理窗口和图形界面(比如*.nib和*.xib文件),那么你可以试着搜索一下“如何在没有Xcode的情况下创建*.nib和*.xib文件”。这只是一个搜索建议,并不是一个完整的答案。

11

你可以导入Foundation和AppKit这两个模块,然后创建一个NSApplication的子类。不过,如果你的pyobjc代码不是你程序的入口点,可能这不是你想要的。能否具体说说你想用pyobjc做什么呢?

这里有个简单的例子,展示如何用pyobjc制作一个简单的状态栏应用,而不需要使用xcode:

import objc
from Foundation import *
from AppKit import *
from PyObjCTools import AppHelper

class MyApp(NSApplication):

    def finishLaunching(self):
        # Make statusbar item
        statusbar = NSStatusBar.systemStatusBar()
        self.statusitem = statusbar.statusItemWithLength_(NSVariableStatusItemLength)
        self.icon = NSImage.alloc().initByReferencingFile_('icon.png')
        self.icon.setScalesWhenResized_(True)
        self.icon.setSize_((20, 20))
        self.statusitem.setImage_(self.icon)

        #make the menu
        self.menubarMenu = NSMenu.alloc().init()

        self.menuItem = NSMenuItem.alloc().initWithTitle_action_keyEquivalent_('Click Me', 'clicked:', '')
        self.menubarMenu.addItem_(self.menuItem)

        self.quit = NSMenuItem.alloc().initWithTitle_action_keyEquivalent_('Quit', 'terminate:', '')
        self.menubarMenu.addItem_(self.quit)

        #add menu to statusitem
        self.statusitem.setMenu_(self.menubarMenu)
        self.statusitem.setToolTip_('My App')

    def clicked_(self, notification):
        NSLog('clicked!')

if __name__ == "__main__":
    app = MyApp.sharedApplication()
    AppHelper.runEventLoop()

然后你可以使用py2app来打包这个应用,使它可以分发:

from distutils.core import setup
import py2app

NAME = 'myapp'
SCRIPT = 'myapp.py'
VERSION = '0.1'
ID = 'myapp'

plist = dict(
     CFBundleName                = NAME,
     CFBundleShortVersionString  = ' '.join([NAME, VERSION]),
     CFBundleGetInfoString       = NAME,
     CFBundleExecutable          = NAME,
     CFBundleIdentifier          = 'com.yourdn.%s' % ID,
     LSUIElement                 = '1', #makes it not appear in cmd-tab task list etc.
)


app_data = dict(script=SCRIPT, plist=plist)

setup(
   app = [app_data],
   options = {
       'py2app':{
           'resources':[
               ],
           'excludes':[
               ]
           }
       }
)

撰写回答