4

我在mac osx上创建了python 2.7中的应用程序10.8.5我想显示通知次数,因此使用NSUserNotificationCenter。在eclipse上运行代码时,通知即将到来。但是,问题是when I made app using py2app, Notifications are not coming。而且,打开控制台和终止的错误的默认页面即将到来。请建议一些方法,如何在py2app生成的dist中包含通知,以便它可以在任何其他机器上工作。 我setup.py是如何在py2app中包含NSUserNotificationCenter

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') 

但在终端这些线很好地运行。

+0

你是否也收到错误信息没有进一步信息,当您从终端发起TE应用程序(即运行“DIST /CC4Box.app/Contents/MacOS/CCBox4“作为Terminal.app中的命令,当您运行py2app时将当前工作目录设置为目录) –

+0

yes,通过终端运行时发生相同的错误。但在eclipse中运行代码时工作正常,因为我在$ PYTHONPATH中添加了路径。不知道如何给它py2app的路径 – imp

+0

什么可能发生的是,当你运行py2app时,$ PYTHONPATH设置是不活动的,因此py2app找不到脚本需要的模块,因此该模块没有被复制到应用程序包。 –

回答

0

我的猜测是,.lookUpClass()应该在运行时解决。因此,你实际上并不想在py2app中包含那个类。除非你自己写这个课。

你想要包括的是objc和相关的库。当你调用py2app时,确保它在你的virtualenv中。如果python -m pydoc objc有效,那么应该python setup.py py2app

+0

NSUserNotification = objc._objc。lookUpClass('NSUserNotification') NSUserNotificationCenter = objc._objc.lookUpClass('NSUserNotificationCenter')我正在使用。它显示没有错误。但是,在其他mac系统中,它显示的是相同的osx版本或不同的apple.lauched.error 501 [128] – imp

+0

? –

+0

也许你还需要'import Foundation'来获得基础服务的python包装? –

0

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

http://wxpython.org/docs/api/wx.PopupWindow-class.html

编辑:那不会得到你所希望的方式一个苹果通知。试试这个代码。它采用所谓的终端通知作出通知的下载命令行工具,通过子过程中,通过蟒蛇访问:

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') 

这应该得到你想要的结果,虽然自动安装它,你需要运行在红宝石构建。您也可以让它播放声音,更改一些ID参数,甚至让它在您点击它时运行shell命令。欲了解更多信息,请点击这里,这是你可以得到源和文档:

https://github.com/julienXX/terminal-notifier

+0

我不想让窗口询问'OK'按退出消息。弹出窗口应该自动出入。我想多次调用弹出式功能。在mac上使用python – imp

+0

有较低级别的WX窗口。您可以使用计时器使其自动关闭。但是,如果您在使用较新的操作系统的Mac上查找屏幕边上弹出的通知矩形,则WX可能不是最佳解决方案。 –

+0

如何实现该弹出。 PLease建议。 – imp