mac - Notificación post osx de Python
python mac descargar (6)
Usando Python, quiero publicar un mensaje en el Centro de notificaciones de OSX. ¿Qué biblioteca necesito usar? ¿Debo escribir un programa en Object-C y luego llamar a ese programa desde Python?
actualizar
¿Cómo accedo a las características del centro de notificación para 10.9, como los botones y el campo de texto?
Aquí hay una forma (necesitas el módulo 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)
Esto funciona solo para MAC. ¡Espero que lo disfrutes!
Para una implementación solo de Python, modifiqué el código que alguien publicó como parte de otra pregunta relacionada, y está funcionando bien para mí:
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://.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"]])
Es probable que pueda limpiar las declaraciones de importación para eliminar algunas importaciones innecesarias.
Primero debe instalar terminal-notifier con Ruby, por ejemplo:
$ [sudo] gem install terminal-notifier
Y luego puedes usar este código:
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!'')
Y ahí tienes:
Pruebe ntfy si también desea que la secuencia de comandos pueda comunicarse con usted a través de otros dispositivos.
Instalación
[sudo] pip install ntfy
donde pip
refiere al instalador del paquete de la versión Python objetivo
Para la instalación de Python3:
[sudo] pip3 install ntfy
Uso
Utilizo esta sencilla función para notificaciones sobre ejecuciones de comandos y finalizaciones de descargas:
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")
Ventajas de ntfy
Esta herramienta es muy útil ya que registra todas las notificaciones directamente en el Centro de notificaciones en lugar de referirse a otra aplicación de terceros.
Compatibilidad con múltiples backend: esta herramienta se puede conectar a usted a través de cualquier dispositivo a través de servicios como PushBullet, SimplePush, Slack, Telegram, etc. Consulte aquí la lista completa de servicios de back-end compatibles.
Todas las otras respuestas aquí requieren bibliotecas de terceros; este no requiere nada Solo usa una secuencia de comandos de apple para crear la notificación:
import os
def notify(title, text):
os.system("""
osascript -e ''display notification "{}" with title "{}"''
""".format(text, title))
notify("Title", "Heres an alert")
Tenga en cuenta que este ejemplo no escapa a comillas, comillas dobles u otros caracteres especiales, por lo que estos caracteres no funcionarán correctamente en el texto o título de la notificación.
copia desde: https://gist.github.com/baliw/4020619
siguientes trabajos para mí.
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")