Desktop Notifier in Python - GeeksforGeeks

16 Jul, 2020
This article demonstrates how to create a simple Desktop Notifier application using Python.
A desktop notifier is a simple application which produces a notification message in form of a pop-up message on desktop.
Notification content
In the example we use in this article, the content that will appear as notification on desktop is the top news headlines of the day.
So, in order to fetch the top headlines, we will be using this Python script to scrape news headlines:
import requestsimport xml.etree.ElementTree as ET  # url of news rss feedRSS_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
It is a simple Python script which parses the news headlines available in XML format.
Note: To understand how XML parsing works, please refer this article: XML parsing in Python
A sample news item generated by above Python script looks like this:
{'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"}

Save this Python script as topnews.py (as we import it by this name in our desktop notifier app).
Installations
Now, in order to create a desktop notifier, you need to install a third party Python module, notify2.
You can install notify2 using a simple pip command:
pip install notify2

Desktop notifier app
Now, we write the Python script for our desktop notifier.
Consider the code below:
import timeimport notify2from topnews import topStories  # path to notification window iconICON_PATH = "put full path to icon image here"  # fetch news itemsnewsitems = topStories()  # initialise the d-bus connectionnotify2.init("News Notifier")  # create Notification objectn = notify2.Notification(None, icon = ICON_PATH)  # set urgency leveln.set_urgency(notify2.URGENCY_NORMAL)  # set timeout for a notificationn.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)
Let us try to analyze above code step by step:
Before we can send any notifications, we need to initialize a D-Bus connection. D-Bus is a message bus system, a simple way for applications to talk to one another. So, D-Bus connection for notify2 in current Python script is initialized using:notify2.init("News Notifier")
Here, the only argument we passed is the app name. You can set any arbitrary app name.
notify2.init("News Notifier")

Here, the only argument we passed is the app name. You can set any arbitrary app name.
Now, we create a notification object, n using:n = notify2.Notification(None, icon = ICON_PATH)
The general syntax for above method is:notify2.Notification(summary, message='', icon='')
Here,summary: The title textmessage: The body texticon: Path to an icon imageCurrently, we have set summary as None and passed the ICON_PATH as icon argument.Note: You need to pass complete path of the icon image.
n = notify2.Notification(None, icon = ICON_PATH)

The general syntax for above method is:
notify2.Notification(summary, message='', icon='')

Here,
summary: The title text
message: The body text
icon: Path to an icon image
Currently, we have set summary as None and passed the ICON_PATH as icon argument.
Note: You need to pass complete path of the icon image.
You can optionally set the urgency level of notifications using set_urgency method:n.set_urgency(notify2.URGENCY_NORMAL)
The available constants are:notify2.URGENCY_LOWnotify2.URGENCY_NORMALnotify2.URGENCY_CRITICAL
n.set_urgency(notify2.URGENCY_NORMAL)

The available constants are:
notify2.URGENCY_LOW
notify2.URGENCY_NORMAL
notify2.URGENCY_CRITICAL
Another optional utility is set_timeout method using which, you can explicitly set the display duration in milliseconds as shown below:n.set_timeout(10000)

n.set_timeout(10000)

Now, as we iterate through each news item one by one, we need to update notification object with a new summary and message using update method:n.update(newsitem['title'], newsitem['description'])
n.update(newsitem['title'], newsitem['description'])
In order to display a notification, simply call show() method of Notification object like this:n.show()

n.show()

A sample screen shot of desktop when you run above Python script:
Github repository for this desktop notifier application: Desktop-Notifier-Example
This blog is contributed by Nikhil Kumar. If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.
Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.
Python-projects
python-utility
Project
Python
Technical Scripter
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Comments
Old Comments
Face Detection using Python and OpenCV with webcam
Banking Transaction System using Java
Snake Game in C
Student Information Management System
Program for Employee Management System
Read JSON file using Python
Adding new column to existing DataFrame in Pandas
Python map() function
How to get column names in Pandas dataframe