it-swarm.com.de

Python-Post-osx-Benachrichtigung

Verwenden von Python Ich möchte eine Nachricht an das OSX Notification Center senden .. Welche Bibliothek muss ich verwenden? Soll ich ein Programm in Objective-C schreiben und dann dieses Programm von Python aus aufrufen? 


Update

Wie kann ich auf die Funktionen der Benachrichtigungszentrale für 10.9 wie die Schaltflächen und das Textfeld zugreifen?

35
kyle k

Sie sollten terminal-notifier zuerst mit Ruby installieren, zum Beispiel:

$ [Sudo] gem install terminal-notifier

Und dann können Sie diesen Code verwenden:

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

Und los gehts:

enter image description here

50
Peter Varo

Alle anderen Antworten hier erfordern Bibliotheken von Drittanbietern. dieser erfordert nichts. Es wird lediglich ein Apple-Skript zum Erstellen der Benachrichtigung verwendet:

import os

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

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

Beachten Sie, dass in diesem Beispiel keine Anführungszeichen, Anführungszeichen oder andere Sonderzeichen verwendet werden, sodass diese Zeichen im Text oder Titel der Benachrichtigung nicht ordnungsgemäß funktionieren.

59

kopie aus: https://Gist.github.com/baliw/4020619

folgende arbeiten für mich.

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

Für eine reine Python-Implementierung habe ich den Code geändert, den jemand als Teil einer anderen verwandten Frage gepostet hat. Er funktioniert gut für mich:

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

Sie könnten die Importanweisungen bereinigen, um einige nicht benötigte Importe zu entfernen.

9
Simon

Probieren Sie ntfy aus, wenn Sie möchten, dass das Skript auch über andere Geräte mit Ihnen kommunizieren kann.

Installation

[Sudo] pip install ntfy 

dabei bezieht sich pip auf das Paketinstallationsprogramm der Python-Zielversion

Für die Installation von Python3:

[Sudo] pip3 install ntfy    

Verwendungszweck

Ich verwende diese einfache Funktion für Benachrichtigungen zu Befehlsausführungen und zum Abschluss von Downloads:

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

Vorteile von ntfy

  1. Dieses Tool ist sehr praktisch, da es alle Benachrichtigungen direkt im Benachrichtigungscenter protokolliert, anstatt auf andere Anwendungen von Drittanbietern zu verweisen.

  2. Mehrere Backend-Unterstützungen: Dieses Tool kann über Dienste wie PushBullet, SimplePush, Slack, Telegramm usw. über jedes Gerät mit Ihnen verbunden werden. Überprüfen Sie die gesamte Liste der unterstützten Backend-Dienste hier .

2
Kshitij Saraogi

Hier ist ein Weg (Sie benötigen das Foundation-Modul):

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)

Dies funktioniert nur für MAC. Ich hoffe dir gefällt es!

1
Xilpex