Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Balloon tip module, Python, using win32gui. Display a notification in the tray bar and quits after 10 seconds.
# -- coding: utf-8 --
from win32api import *
from win32gui import *
import win32con
import sys, os
import struct
import time
class WindowsBalloonTip:
def __init__(self, title, msg):
message_map = {
win32con.WM_DESTROY: self.OnDestroy,
}
# Register the Window class.
wc = WNDCLASS()
hinst = wc.hInstance = GetModuleHandle(None)
wc.lpszClassName = "PythonTaskbar"
wc.lpfnWndProc = message_map # could also specify a wndproc.
classAtom = RegisterClass(wc)
# Create the Window.
style = win32con.WS_OVERLAPPED | win32con.WS_SYSMENU
self.hwnd = CreateWindow( classAtom, "Taskbar", style, \
0, 0, win32con.CW_USEDEFAULT, win32con.CW_USEDEFAULT, \
0, 0, hinst, None)
UpdateWindow(self.hwnd)
iconPathName = os.path.abspath(os.path.join( sys.path[0], "balloontip.ico" ))
icon_flags = win32con.LR_LOADFROMFILE | win32con.LR_DEFAULTSIZE
try:
hicon = LoadImage(hinst, iconPathName, \
win32con.IMAGE_ICON, 0, 0, icon_flags)
except:
hicon = LoadIcon(0, win32con.IDI_APPLICATION)
flags = NIF_ICON | NIF_MESSAGE | NIF_TIP
nid = (self.hwnd, 0, flags, win32con.WM_USER+20, hicon, "tooltip")
Shell_NotifyIcon(NIM_ADD, nid)
Shell_NotifyIcon(NIM_MODIFY, \
(self.hwnd, 0, NIF_INFO, win32con.WM_USER+20,\
hicon, "Balloon tooltip",msg,200,title))
# self.show_balloon(title, msg)
time.sleep(10)
DestroyWindow(self.hwnd)
def OnDestroy(self, hwnd, msg, wparam, lparam):
nid = (self.hwnd, 0)
Shell_NotifyIcon(NIM_DELETE, nid)
PostQuitMessage(0) # Terminate the app.
def balloon_tip(title, msg):
w=WindowsBalloonTip(title, msg)
@endolith

This comment has been minimized.

Copy link

@endolith endolith commented Jun 14, 2013

Should have an example like

if __name__ == '__main__':
    balloon_tip('Demonstration', 'Here is a balloon tip')

Also I can't do this more than once or it gives an error:

In [4]: balloon_tip('title', 'message')
------------------------------------------------------------
Traceback (most recent call last):
  File "<ipython console>", line 1, in <module>
  File "balloontip.py", line 55, in balloon_tip
    w=WindowsBalloonTip(title, msg)
  File "balloontip.py", line 26, in __init__
    classAtom = RegisterClass(wc)
error: (1410, 'RegisterClass', 'Class already exists.')

Probably relevant: http://stackoverflow.com/q/3638988/125507

@brousch

This comment has been minimized.

Copy link

@brousch brousch commented Sep 11, 2013

I PEPped this up a bit and fixed the "no 2nd notification" issue that @endolith reported. It still has one issue, which is that only one notification at a time can display, so if a 2nd notification is attempted before the 1st has finished, the 2nd is ignored. https://gist.github.com/brousch/6523559

@vvps

This comment has been minimized.

Copy link

@vvps vvps commented Mar 23, 2015

Hey thanks for this gist! I used it in my backup script! https://github.com/vijayparsi/pyBackup

@endolith

This comment has been minimized.

Copy link

@endolith endolith commented Mar 24, 2015

@brousch: dead link?

@asm95

This comment has been minimized.

Copy link

@asm95 asm95 commented Jul 31, 2016

For anyone who needs a fix to @endolith's problem, after line 42 insert this code:

UnregisterClass(classAtom, hinst)

@Strofe

This comment has been minimized.

Copy link

@Strofe Strofe commented Feb 8, 2018

Bonjour
Merci c'est impeccable.

Hi,
Thank you, It's wonderful

@JakubBlaha

This comment has been minimized.

Copy link

@JakubBlaha JakubBlaha commented Feb 26, 2018

Thank you @asm95!!

@hold7door

This comment has been minimized.

Copy link

@hold7door hold7door commented May 27, 2018

How to increase the display time of the balloon? It fades away after few seconds even if the script is running.

@randair0x

This comment has been minimized.

Copy link

@randair0x randair0x commented Aug 3, 2018

For those willing to change the time of the notification:
Go to line 41 and change time.sleep(__) to whatever number of seconds you want.

@vineethpisvas1

This comment has been minimized.

Copy link

@vineethpisvas1 vineethpisvas1 commented Nov 30, 2018

Can anyone please tell me how to add a click bind to this notification. I want to open a website or do some task on the click and I am not able to bind it in the message map. Please help!

@vineethpisvas1

This comment has been minimized.

@Ldimento

This comment has been minimized.

Copy link

@Ldimento Ldimento commented Jan 24, 2020

How do I get a notification from the site I need?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.