Como envio mensagens de texto para os balões de notificação?

38

Eu escrevi um código python para obter texto aleatório em um arquivo .txt. Agora, quero enviar esse texto aleatório para a área de notificação via comando 'notify-send'. Como fazemos isso?

Anuroop Kuppam
fonte

Respostas:

63

Sempre podemos chamar notificar-enviar como um subprocesso, por exemplo:

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

import subprocess

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

Como alternativa, também podemos instalar o python-notify e chamar a notificação por meio disso:

import pynotify

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

Observe que não há nenhum pacote python3-notify disponível no Ubuntu. Se você estiver usando o Python 3, precisará usar o python3-notify2 . A API para notify2 é a mesma: basta substituir pynotifypor notify2.

Takkat
fonte
1
Eu tive que usar subprocess.Popen(['notify-send', message])para fazer o primeiro exemplo funcionar.
lgarzo
O segundo a pynotify.init("Test")e pynotify.Notification(title, message).show(). Pelo jeito que eu sou “Aprender Python The Hard Way”, então eu só poderia esquecer alguma coisa ...
lgarzo
Sinto muito por isso. Não pude testar isso mais cedo na minha caixa de trabalho - meu mal. Editado os bits que faltam.
Takkat
10

python3

Embora você possa ligar notify-sendvia os.systemou subprocessseja indiscutivelmente mais consistente com a programação baseada em GTK3, use a classe Notify gobject-introspection .

Um pequeno exemplo mostrará isso em ação:

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")
liberdade de expressão
fonte
Não apenas mais consistente com a programação Gtk, mas também é um processo único: não há nenhum fork-exec em andamento, portanto, não há desperdício de recursos em gerar um novo processo apenas para enviar um balão de notificação, além de Popen()chamar o shell para executar o comando. processo shell aparecendo também.
Sergiy Kolodyazhnyy 15/10
6
import os
mstr='Hello'
os.system('notify-send '+mstr)
Syed 'ensolarado' I. Tauhidi
fonte
Como personalizo esta notificação? Como título, imagem na notificação, etc.?
mehulmpt
1
Esta versão é vulnerável à execução arbitrária de comandos.
Steve
5

Para responder à pergunta de Mehul Mohan e propor a maneira mais curta de enviar uma notificação com as seções de título e mensagem:

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

Colocar isso em função pode ser um pouco confuso devido a aspas entre aspas

import os
def message(title, message):
  os.system('notify-send "'+title+'" "'+message+'"')
Silver Ringvee
fonte
4
Você pode sugerir uma edição para essa postagem.
Muru
2
Que tal usar em 'notify-send "{}" "{}"'.format(title, message)vez de adicionar strings?
precisa saber é o seguinte
5

Para quem vê isso em +2018, posso recomendar o pacote notify2 .

Esta é uma substituição python pura para notify-python, usando python-dbus para se comunicar diretamente com o servidor de notificações. É compatível com Python 2 e 3, e seus retornos de chamada podem funcionar com aplicativos Gtk 3 ou Qt 4.

Bárbaro Supremo
fonte
4

Você deve usar o pacote notify2 , é um substituto para o python-notify. Use-o como segue.

pip install notify2

E o código:

import notify2
notify2.init('app name')
n = notify2.Notification('title', 'message')
n.show()
jcofta
fonte