【问题标题】:how to include NSUserNotificationCenter in py2app如何在 py2app 中包含 NSUserNotificationCenter
【发布时间】:2013-11-09 19:05:52
【问题描述】:

我正在 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') 

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

【问题讨论】:

  • 当您从终端启动应用程序(即在 Terminal.app 中作为命令运行“dist/CC4Box.app/Contents/MacOS/CCBox4”)时,您是否还会收到没有更多信息的错误消息, 当前工作目录设置为运行 py2app 时的目录)
  • 是的,通过终端运行时出现同样的错误。但是在 Eclipse 中运行代码时工作正常,因为我在 $PYTHONPATH 中添加了路径。不知道如何在 py2app 中为其提供路径
  • 可能发生的情况是 $PYTHONPATH 设置在您运行 py2app 时未激活,因此 py2app 找不到脚本所需的模块,因此该模块不会复制到应用程序包中。
  • 是的,在 Eclipse 中,我们可以设置 $PYTHONPATH,因此它工作正常。但是,对于 py2app,我想没有这样的东西来包含模块。有没有其他方法可以解决这个问题
  • 你需要在运行“python setup.py py2app”的shell中设置PYTHONPATH,PYTHONPATH是python设置,不是py2app设置.

标签: python macos py2app nsusernotification nsusernotificationcenter


【解决方案1】:

如果您尝试创建一个弹出窗口来通知用户某些信息,有很多 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

【讨论】:

  • 我不希望窗口要求“确定”按退出消息。弹出窗口应该会自动出现和消失。我想多次调用弹出功能。在 mac 上使用 python
  • 有较低级别的 WX 窗口。您可以使用计时器使其自动关闭。但是,如果您在使用较新操作系统的 Mac 上寻找在屏幕侧面弹出的通知矩形,WX 可能不是最佳解决方案。
  • 如何实现该弹出窗口。请提出建议。
  • 这应该是你要找的
  • 我想实现简单的弹窗向用户显示文本消息,可以通过py2app轻松捆绑。不像要求单击“确定”退出的窗口。请提出建议。
【解决方案2】:

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

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

【讨论】:

  • NSUserNotification = objc._objc.lookUpClass('NSUserNotification') NSUserNotificationCenter = objc._objc.lookUpClass('NSUserNotificationCenter') 我正在使用。它显示没有错误。但是,在其他 mac 系统中,它显示 apple.lauched.error 501[128]
  • osx 版本相同还是不同?
  • 也许您还需要import Foundation 来获取基础服务 python 包装器?
  • 相同的 osx 版本。我正在导入 Foundation、AppKit、objc。有没有其他方法可以在python中实现弹出通知,并且可以通过py2app有效地打包。
  • 在过去,Growl 是必需的。现在,我认为你应该能够在没有的情况下过日子。
猜你喜欢
  • 2011-05-29
  • 1970-01-01
  • 1970-01-01
  • 2012-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-16
  • 1970-01-01
相关资源
最近更新 更多