4

我在 mac osx 10.8.5 上的 python 2.7 中制作应用程序我想显示通知次数,因此使用NSUserNotificationCenter. 在 Eclipse 上运行代码时会收到通知。但是,问题是when I made app using py2app, Notifications are not coming。此外,打开控制台和终止的默认错误页面即将到来。请提出一些建议,如何在 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') 

但在终端这些行运行良好。

4

2 回答 2

0

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

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

编辑:那不会以您想要的方式收到苹果通知。试试这个代码。它使用名为 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 命令。有关更多信息,请访问此处,您可以在此处获取源代码和文档:

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

于 2013-11-19T03:46:24.377 回答
0

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

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

于 2013-11-18T13:57:50.420 回答