Python 如何在py2app中包含NSUserNotificationCenter

Python 如何在py2app中包含NSUserNotificationCenter,python,macos,py2app,nsusernotification,nsusernotificationcenter,Python,Macos,Py2app,Nsusernotification,Nsusernotificationcenter,我正在mac osx 10.8.5上用python 2.7制作一个应用程序,我想显示通知次数,因此使用NSUserNotificationCenter。在eclipse上运行代码时会出现通知。但是,问题是当我使用py2app制作应用程序时,通知不会出现。此外,OpenConsole和Terminate的默认错误页面即将出现。请建议一些方法,如何在py2app生成的dist中包含通知,以便它可以在任何其他机器上工作。 我的setup.py是 from setuptools import setup

我正在mac osx 10.8.5上用python 2.7制作一个应用程序,我想显示通知次数,因此使用
NSUserNotificationCenter
。在eclipse上运行代码时会出现通知。但是,问题是
当我使用py2app制作应用程序时,通知不会出现。此外,OpenConsole和Terminate的默认错误页面即将出现。请建议一些方法,如何在py2app生成的dist中包含通知,以便它可以在任何其他机器上工作。
我的setup.py是

from setuptools import setup

APP=['CC4Box.py']
DATA_FILES= [('',['config.cfg'])]
OPTIONS={'iconfile':'cc.icns','argv_emulation': True,'plist':{'CFBundleShortVersionString':'1.0'}}

setup(
    app=APP,
    data_files=DATA_FILES,
    options={'py2app': OPTIONS},
    setup_requires=['py2app']
    ) 
我的通知代码是:

def notify(title, subtitle, info_text, delay=0, sound=False, userInfo={}):
    NSUserNotification = objc.lookUpClass('NSUserNotification')
    NSUserNotificationCenter = objc.lookUpClass('NSUserNotificationCenter')
    notification = NSUserNotification.alloc().init()
    notification.setTitle_(title)
    notification.setSubtitle_(subtitle)
    notification.setInformativeText_(info_text)
    notification.setUserInfo_(userInfo)
    if sound:
        notification.setSoundName_("NSUserNotificationDefaultSoundName")
    notification.setDeliveryDate_(Foundation.NSDate.dateWithTimeInterval_sinceDate_(delay, Foundation.NSDate.date()))
    NSUserNotificationCenter.defaultUserNotificationCenter().scheduleNotification_(notification)


def notificationBalloon(title,msg):
    notify(title1, msg1,"", sound=False) 
在eclipse上,通知如预期的那样出现,但是,在以下行中产生了导入错误:

NSUserNotification = objc.lookUpClass('NSUserNotification')
 NSUserNotificationCenter = objc.lookUpClass('NSUserNotificationCenter') 

但在终端,这些线路运行良好

我猜,
应该在运行时解析.lookUpClass()
。因此,您实际上不希望在py2app中包含该类。除非是你自己写的这个类


您想要包括的是
objc
和相关库。当您调用py2app时,请确保它在您的虚拟环境中。如果
python-m pydoc objc
起作用,那么
python setup.py py2app

如果您试图创建一个弹出窗口来通知用户某些信息,那么有很多python模块用于此目的。Wx python是一个不错的选择。以下是弹出窗口的文档:

编辑:这不会以你想要的方式得到苹果的通知。试试这个代码。它使用可下载的命令行工具terminal notifier来发出通知,通过python通过子进程访问:

import subprocess

def notification(title, subtitle, message):
    subprocess.Popen(['terminal-notifier','-message',message,'-title',title,'-subtitle',subtitle])

notification(title = 'notification title', subtitle = 'subtitle', message  = 'Hello World')
这应该会得到您想要的结果,尽管要自动安装它,您需要在ruby中运行构建。您还可以让它播放声音,更改一些ID参数,甚至在单击它时告诉它运行shell命令。有关更多信息,请访问此处,您可以在此处获取源文件和文档:


当您从终端启动te应用程序(即在terminal.app中作为命令运行“dist/CC4Box.app/Contents/MacOS/CCBox4”,当前工作目录设置为运行py2app时的目录)时,是否也会收到错误消息而无需进一步信息?是的,通过终端运行时会发生相同的错误。但在eclipse中运行代码时工作正常,因为我在$PYTHONPATH中添加了路径。不知道如何在py2app中为它指定路径可能发生的情况是,在运行py2app时,$PYTHONPATH设置未处于活动状态,因此py2app找不到脚本所需的模块,因此该模块未复制到应用程序包中。是的,在eclipse中,我们可以设置$PYTHONPATH,因此它工作正常。但是,有了py2app,我想没有这样的东西可以包含模块。是否有其他方法解决此问题需要在运行“python setup.py py2app”的shell中设置PYTHONPATH,PYTHONPATH是一个python设置,而不是py2app设置。NSUserNotification=objc。_objc.lookUpClass('NSUserNotification')NSUserNotificationCenter=objc。_objc.lookUpClass('NSUserNotificationCenter')我正在使用。它没有显示错误。但是,在其他的MAC系统中,它正在显示Apple。LaCCHED.Error 501(128)相同的OSX版本或不同的版本?也许您还需要<代码>导入基础< /代码>以获得基础服务Python包装器。我正在导入基金会,AppKIT,Objc。有没有其他的弹出式通知方式,我可以用python实现,并且可以通过py2app有效地打包。在过去,需要使用
Growl
。现在,我想你们应该可以不用了。我不希望窗口要求“OK”按钮退出消息。弹出窗口应自动出现和消失。我想多次调用弹出函数。在Mac上使用python有较低级别的WX窗口。您可以使用计时器使其自动关闭。然而,如果你想在一个有更新操作系统的mac电脑上寻找屏幕侧面弹出的通知矩形,WX可能不是最好的解决方案。请建议。这应该是你正在寻找的我想实现简单的弹出窗口显示文字信息给用户,可以很容易地通过py2app捆绑。与要求单击“确定”退出的窗口不同。请建议。