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?

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.


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

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)

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


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.


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()
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.