📜  Python中的桌面通知程序

📅  最后修改于: 2022-05-13 01:54:38.431000             🧑  作者: Mango

Python中的桌面通知程序

本文演示了如何使用Python创建一个简单的Desktop Notifier应用程序。

桌面通知程序是一个简单的应用程序,它在桌面上以弹出消息的形式生成通知消息。

通知内容

在我们在本文中使用的示例中,将作为通知显示在桌面上的内容是当天的头条新闻

因此,为了获取头条新闻,我们将使用这个Python脚本来抓取新闻头条:

import requests
import xml.etree.ElementTree as ET
  
# url of news rss feed
RSS_FEED_URL = "http://www.hindustantimes.com/rss/topnews/rssfeed.xml"    
  
def loadRSS():
    '''
    utility function to load RSS feed
    '''
    # create HTTP request response object
    resp = requests.get(RSS_FEED_URL)
  
    # return response content
    return resp.content
  
def parseXML(rss):
    '''
    utility function to parse XML format rss feed
    '''
    # create element tree root object
    root = ET.fromstring(rss)
  
    # create empty list for news items
    newsitems = []
  
    # iterate news items
    for item in root.findall('./channel/item'):
        news = {}
  
        # iterate child elements of item
        for child in item:
  
            # special checking for namespace object content:media
            if child.tag == '{http://search.yahoo.com/mrss/}content':
                news['media'] = child.attrib['url']
            else:
                news[child.tag] = child.text.encode('utf8')
        newsitems.append(news)
  
    # return news items list
    return newsitems
  
def topStories():
    '''
    main function to generate and return news items
    '''
    # load rss feed
    rss = loadRSS()
  
    # parse XML
    newsitems = parseXML(rss)
    return newsitems

它是一个简单的Python脚本,可以解析 XML 格式的新闻标题。

注意:要了解 XML 解析的工作原理,请参阅这篇文章: Python中的 XML 解析

上面Python脚本生成的示例新闻如下所示:

{'description': 'Months after it was first reported, the feud between Dwayne Johnson and 
                 Vin Diesel continues to rage on, with a new report saying that the two are 
                 being kept apart during the promotions of The Fate of the Furious.',
 'link': 'http://www.hindustantimes.com/hollywood/vin-diesel-dwayne-johnson-feud-rages-
on-they-re-being-kept-apart-for-fast-8-tour/story-Bwl2Nx8gja9T15aMvcrcvL.html',
 'media': 'http://www.hindustantimes.com/rf/image_size_630x354/HT/p2/2017/04/01/Pictures
/_fbcbdc10-1697-11e7-9d7a-cd3db232b835.jpg',
 'pubDate': b'Sat, 01 Apr 2017 05:22:51 GMT ',
 'title': "Vin Diesel, Dwayne Johnson feud rages on; they're being deliberately kept apart"}

将此Python脚本另存为topnews.py (当我们在桌面通知程序应用程序中按此名称导入它时)。

安装

现在,为了创建桌面通知程序,您需要安装第三方Python模块notify2

您可以使用简单的 pip 命令安装notify2

pip install notify2

桌面通知应用程序

现在,我们为桌面通知程序编写Python脚本。

考虑下面的代码:

import time
import notify2
from topnews import topStories
  
# path to notification window icon
ICON_PATH = "put full path to icon image here"
  
# fetch news items
newsitems = topStories()
  
# initialise the d-bus connection
notify2.init("News Notifier")
  
# create Notification object
n = notify2.Notification(None, icon = ICON_PATH)
  
# set urgency level
n.set_urgency(notify2.URGENCY_NORMAL)
  
# set timeout for a notification
n.set_timeout(10000)
  
for newsitem in newsitems:
  
    # update notification data for Notification object
    n.update(newsitem['title'], newsitem['description'])
  
    # show notification on screen
    n.show()
  
    # short delay between notifications
    time.sleep(15)

让我们尝试一步一步地分析上面的代码:

  • 在我们发送任何通知之前,我们需要初始化一个 D-Bus 连接。 D-Bus 是一种消息总线系统,是应用程序相互通信的一种简单方式。因此,当前Python脚本中 notify2 的 D-Bus 连接使用以下方法初始化:
    notify2.init("News Notifier")
    

    在这里,我们传递的唯一参数是应用程序名称。您可以设置任意应用名称。

  • 现在,我们创建一个通知对象, n使用:
    n = notify2.Notification(None, icon = ICON_PATH)
    

    上述方法的一般语法是:

    notify2.Notification(summary, message='', icon='')
    

    这里,

    • 摘要:标题文本
    • 消息:正文
    • 图标:图标图像的路径

    目前,我们已将摘要设置为None并将ICON_PATH作为图标参数传递。

    注意:您需要传递图标图像的完整路径。

  • 您可以选择使用set_urgency方法设置通知的紧急级别:
    n.set_urgency(notify2.URGENCY_NORMAL)
    

    可用的常量是:

    • notify2.URGENCY_LOW
    • notify2.URGENCY_NORMAL
    • notify2.URGENCY_CRITICAL
  • 另一个可选实用程序是set_timeout方法,您可以使用它显式设置显示持续时间(以毫秒为单位),如下所示:
    n.set_timeout(10000)
    
  • 现在,当我们逐个遍历每个新闻项目时,我们需要使用update方法用新的摘要消息更新通知对象:
    n.update(newsitem['title'], newsitem['description'])
  • 为了显示通知,只需调用 Notification 对象的show()方法,如下所示:
    n.show()
    

在Python脚本上运行时的桌面示例屏幕截图:

头条新闻1

此桌面通知程序应用程序的 Github 存储库:Desktop-Notifier-Example