59

Python を使用して、OSX 通知センターにメッセージを投稿したいと考えています。どのライブラリを使用する必要がありますか? Objective-C でプログラムを作成し、そのプログラムを Python から呼び出す必要がありますか?


アップデート

ボタンやテキスト フィールドなど、10.9 の通知センターの機能にアクセスするにはどうすればよいですか?

4

7 に答える 7

141

ここでの他のすべての回答には、サードパーティのライブラリが必要です。これは何も必要としません。Apple スクリプトを使用して通知を作成するだけです。

import os

def notify(title, text):
    os.system("""
              osascript -e 'display notification "{}" with title "{}"'
              """.format(text, title))

notify("Title", "Heres an alert")

この例では、引用符、二重引用符、またはその他の特殊文字をエスケープしないため、これらの文字は通知のテキストまたはタイトルで正しく機能しないことに注意してください。

更新:これは任意の文字列で機能するはずです。何もエスケープする必要はありません。Appleスクリプトプログラムのテキストに生の文字列を埋め込もうとするのではなく、生の文字列を引数としてAppleスクリプトに渡すことで機能します。

import subprocess

CMD = '''
on run argv
  display notification (item 2 of argv) with title (item 1 of argv)
end run
'''

def notify(title, text):
  subprocess.call(['osascript', '-e', CMD, title, text])

# Example uses:
notify("Title", "Heres an alert")
notify(r'Weird\/|"!@#$%^&*()\ntitle', r'!@#$%^&*()"')
于 2016-12-25T02:01:55.583 に答える
17

コピー元: https://gist.github.com/baliw/4020619

以下は私のために働きます。

import Foundation
import objc
import AppKit
import sys

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

def notify(title, subtitle, info_text, delay=0, sound=False, userInfo={}):
    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)


notify("Test message", "Subtitle", "This message should appear instantly, with a sound", sound=True)
sys.stdout.write("Notification sent...\n")
于 2014-06-01T13:51:02.577 に答える
8

Python のみの実装では、誰かが別の関連する質問の一部として投稿したコードを変更しましたが、うまく機能しています。

import mmap, os, re, sys
from PyObjCTools import AppHelper
import Foundation
import objc
import AppKit
import time
from threading import Timer

from datetime import datetime, date

# objc.setVerbose(1)

class MountainLionNotification(Foundation.NSObject):
    # Based on http://stackoverflow.com/questions/12202983/working-with-mountain-lions-notification-center-using-pyobjc

    def init(self):
        self = super(MountainLionNotification, self).init()
        if self is None: return None

        # Get objc references to the classes we need.
        self.NSUserNotification = objc.lookUpClass('NSUserNotification')
        self.NSUserNotificationCenter = objc.lookUpClass('NSUserNotificationCenter')

        return self

    def clearNotifications(self):
        """Clear any displayed alerts we have posted. Requires Mavericks."""

        NSUserNotificationCenter = objc.lookUpClass('NSUserNotificationCenter')
        NSUserNotificationCenter.defaultUserNotificationCenter().removeAllDeliveredNotifications()

    def notify(self, title, subtitle, text, url):
        """Create a user notification and display it."""

        notification = self.NSUserNotification.alloc().init()
        notification.setTitle_(str(title))
        notification.setSubtitle_(str(subtitle))
        notification.setInformativeText_(str(text))
        notification.setSoundName_("NSUserNotificationDefaultSoundName")
        notification.setHasActionButton_(True)
        notification.setActionButtonTitle_("View")
        notification.setUserInfo_({"action":"open_url", "value":url})

        self.NSUserNotificationCenter.defaultUserNotificationCenter().setDelegate_(self)
        self.NSUserNotificationCenter.defaultUserNotificationCenter().scheduleNotification_(notification)

        # Note that the notification center saves a *copy* of our object.
        return notification

    # We'll get this if the user clicked on the notification.
    def userNotificationCenter_didActivateNotification_(self, center, notification):
        """Handler a user clicking on one of our posted notifications."""

        userInfo = notification.userInfo()
        if userInfo["action"] == "open_url":
            import subprocess
            # Open the log file with TextEdit.
            subprocess.Popen(['open', "-e", userInfo["value"]])

インポートステートメントをクリーンアップして、不要なインポートを削除する可能性があります。

于 2014-02-03T18:10:40.047 に答える
4

スクリプトが他のデバイスを介して通信できるようにする場合は、ntfyを試してください。

インストール

[sudo] pip install ntfy 

ここpipで、対象の Python バージョンのパッケージ インストーラーを参照します。

Python3 インストールの場合:

[sudo] pip3 install ntfy    

使用法

コマンドの実行とダウンロードの完了に関する通知には、次の単純な関数を使用します。

def notification(title, message):
    """Notifies the logged in user about the download completion."""

    import os
    cmd = 'ntfy -t {0} send {1}'.format(title, message)
    os.system(cmd)

notification("Download Complete", "Mr.RobotS01E05.mkv saved at /path")

ntfyの利点

  1. このツールは、他のサードパーティ アプリケーションを参照するのではなく、すべての通知を通知センターに直接記録するため、非常に便利です。

  2. 複数のバックエンドのサポート: このツールは、PushBullet、SimplePush、Slack、Telegram などのサービスを介して任意のデバイスを介して接続できます。サポートされているバックエンド サービスの全リストは、こちらで確認してください。

于 2017-04-03T18:25:01.847 に答える