web-dev-qa-db-ja.com

Python OSX通知後

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


更新

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

41
kyle k

terminal-notifier を最初にインストールする必要がありますRuby例:

$ [Sudo] gem install terminal-notifier

そして、次のコードを使用できます。

import os

# The notifier function
def notify(title, subtitle, message):
    t = '-title {!r}'.format(title)
    s = '-subtitle {!r}'.format(subtitle)
    m = '-message {!r}'.format(message)
    os.system('terminal-notifier {}'.format(' '.join([m, t, s])))

# Calling the function
notify(title    = 'A Real Notification',
       subtitle = 'with python',
       message  = 'Hello, this is me, notifying you!')

そしてそこに行きます:

enter image description here

51
Peter Varo

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

import os

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

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

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

75

コピー元: 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")
15
sesame

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"]])

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

9
Simon

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

Installation

[Sudo] pip install ntfy 

pipは、ターゲットのパッケージインストーラーを指しますPython version

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などのサービスを介して任意のデバイスを介して接続できます。サポートされるバックエンドサービスのリスト全体を確認してください here

3
Kshitij Saraogi

方法は次のとおりです(Foundationモジュールが必要です):

from Foundation import NSUserNotification
from Foundation import NSUserNotificationCenter
from Foundation import NSUserNotificationDefaultSoundName


class Notification():
    def notify(self, _title, _message, _sound = False):
        self._title = _title
        self._message = _message
        self._sound = _sound

        self.notification = NSUserNotification.alloc().init()
        self.notification.setTitle_(self._title)
        self.notification.setInformativeText_(self._message)
        if self._sound == True:
            self.notification.setSoundName_(NSUserNotificationDefaultSoundName)

        center = NSUserNotificationCenter.defaultUserNotificationCenter()
        center.deliverNotification_(self.notification)

N = Notification()
N.notify(_title="SOME", _message="Something", _sound=True)

これはMACでのみ機能します。お楽しみください!

1
user6913652