Как отправить текстовые сообщения на пузыри уведомлений?

39

Я написал код Python для получения случайного текста в файл .txt. Теперь я хочу отправить этот случайный текст в область уведомлений с помощью команды notify-send. Как мы это делаем?

Anuroop Kuppam
источник

Ответы:

64

Мы всегда можем вызвать notify-send как подпроцесс, например, так:

#!/usr/bin/env python
#-*- coding: utf-8 -*-

import subprocess

def sendmessage(message):
    subprocess.Popen(['notify-send', message])
    return

В качестве альтернативы мы могли бы также установить python-notify и вызвать уведомление через это:

import pynotify

def sendmessage(title, message):
    pynotify.init("Test")
    notice = pynotify.Notification(title, message)
    notice.show()
    return

Обратите внимание, что в Ubuntu нет пакета python3-notify. Если вы используете Python 3, вам нужно использовать python3-notify2 . API для notify2 такой же: просто замените pynotifyна notify2.

Takkat
источник
1
Мне пришлось использовать, subprocess.Popen(['notify-send', message])чтобы первый пример работал.
lgarzo
Второй а pynotify.init("Test")а pynotify.Notification(title, message).show(). Кстати, я «Изучаю Python трудный путь», так что я мог бы просто что-то упустить из виду ...
lgarzo
Извините за это. Я не смог проверить это раньше на моей коробке на работе - мой плохой. Отредактировал недостающие биты.
Таккат
10

python3

Хотя вы можете вызывать с notify-sendпомощью os.systemили, subprocessвозможно, более совместимо с программированием на основе GTK3 использовать класс Notify gobject-introspection .

Небольшой пример покажет это в действии:

from gi.repository import GObject
from gi.repository import Notify

class MyClass(GObject.Object):
    def __init__(self):

        super(MyClass, self).__init__()
        # lets initialise with the application name
        Notify.init("myapp_name")

    def send_notification(self, title, text, file_path_to_icon=""):

        n = Notify.Notification.new(title, text, file_path_to_icon)
        n.show()

my = MyClass()
my.send_notification("this is a title", "this is some text")
fossfreedom
источник
Не только в большей степени согласуется с программированием на Gtk, но и представляет собой единый процесс: здесь не выполняется fork-exec, поэтому не нужно тратить ресурсы на создание нового процесса, просто чтобы послать уведомление, плюс Popen()вызовет shell для запуска команды, так что процесс оболочки тоже выскакивает.
Сергей Колодяжный
6
import os
mstr='Hello'
os.system('notify-send '+mstr)
Сайед "Солнечный" И. Таухиди
источник
Как мне настроить это уведомление? Как заголовок, изображение в уведомлении и т. Д.?
mehulmpt
1
Эта версия уязвима для выполнения произвольной команды.
Стив
5

Чтобы ответить на вопрос Мехула Мохана, а также предложить кратчайший способ отправить уведомление с разделами заголовка и сообщения:

import os
os.system('notify-send "TITLE" "MESSAGE"')

Включение этого в функцию может быть немного запутанным из-за кавычек в кавычках

import os
def message(title, message):
  os.system('notify-send "'+title+'" "'+message+'"')
Серебряное Кольцо
источник
4
Вы можете предложить редактировать этот пост.
Муру
2
Как насчет использования, 'notify-send "{}" "{}"'.format(title, message)а не добавления строк?
Стам
5

Для тех, кто смотрит на это в +2018, я могу порекомендовать пакет notify2 .

Это чистая замена python для notify-python, использующая python-dbus для прямой связи с сервером уведомлений. Он совместим с Python 2 и 3, а его обратные вызовы могут работать с приложениями Gtk 3 или Qt 4.

Верховный варвар
источник
4

Вы должны использовать пакет notify2 , это замена для python-notify. Используйте это как следует.

pip install notify2

И код:

import notify2
notify2.init('app name')
n = notify2.Notification('title', 'message')
n.show()
jcofta
источник