Quick and easy: trayicon with python? Quick and easy: trayicon with python? python python

Quick and easy: trayicon with python?


For Windows & Gnome

Here ya go! wxPython is the bomb. Adapted from the source of my Feed Notifier application.

import wxTRAY_TOOLTIP = 'System Tray Demo'TRAY_ICON = 'icon.png'def create_menu_item(menu, label, func):    item = wx.MenuItem(menu, -1, label)    menu.Bind(wx.EVT_MENU, func, id=item.GetId())    menu.AppendItem(item)    return itemclass TaskBarIcon(wx.TaskBarIcon):    def __init__(self):        super(TaskBarIcon, self).__init__()        self.set_icon(TRAY_ICON)        self.Bind(wx.EVT_TASKBAR_LEFT_DOWN, self.on_left_down)    def CreatePopupMenu(self):        menu = wx.Menu()        create_menu_item(menu, 'Say Hello', self.on_hello)        menu.AppendSeparator()        create_menu_item(menu, 'Exit', self.on_exit)        return menu    def set_icon(self, path):        icon = wx.IconFromBitmap(wx.Bitmap(path))        self.SetIcon(icon, TRAY_TOOLTIP)    def on_left_down(self, event):        print 'Tray icon was left-clicked.'    def on_hello(self, event):        print 'Hello, world!'    def on_exit(self, event):        wx.CallAfter(self.Destroy)def main():    app = wx.PySimpleApp()    TaskBarIcon()    app.MainLoop()if __name__ == '__main__':    main()


wx.PySimpleApp deprecated, here's how to use wx.App instead

Took me while to figure this out so I thought I'd share. wx.PySimpleApp is deprecated in wxPython 2.9 and beyond. Here's FogleBird's original script using wx.App instead.

import wxTRAY_TOOLTIP = 'System Tray Demo'TRAY_ICON = 'icon.png'def create_menu_item(menu, label, func):    item = wx.MenuItem(menu, -1, label)    menu.Bind(wx.EVT_MENU, func, id=item.GetId())    menu.AppendItem(item)    return itemclass TaskBarIcon(wx.TaskBarIcon):    def __init__(self, frame):        self.frame = frame        super(TaskBarIcon, self).__init__()        self.set_icon(TRAY_ICON)        self.Bind(wx.EVT_TASKBAR_LEFT_DOWN, self.on_left_down)    def CreatePopupMenu(self):        menu = wx.Menu()        create_menu_item(menu, 'Say Hello', self.on_hello)        menu.AppendSeparator()        create_menu_item(menu, 'Exit', self.on_exit)        return menu    def set_icon(self, path):        icon = wx.IconFromBitmap(wx.Bitmap(path))        self.SetIcon(icon, TRAY_TOOLTIP)    def on_left_down(self, event):        print 'Tray icon was left-clicked.'    def on_hello(self, event):        print 'Hello, world!'    def on_exit(self, event):        wx.CallAfter(self.Destroy)        self.frame.Close()class App(wx.App):    def OnInit(self):        frame=wx.Frame(None)        self.SetTopWindow(frame)        TaskBarIcon(frame)        return Truedef main():    app = App(False)    app.MainLoop()if __name__ == '__main__':    main()


2018 version

import wx.advimport wxTRAY_TOOLTIP = 'Name' TRAY_ICON = 'icon.png' def create_menu_item(menu, label, func):    item = wx.MenuItem(menu, -1, label)    menu.Bind(wx.EVT_MENU, func, id=item.GetId())    menu.Append(item)    return itemclass TaskBarIcon(wx.adv.TaskBarIcon):    def __init__(self, frame):        self.frame = frame        super(TaskBarIcon, self).__init__()        self.set_icon(TRAY_ICON)        self.Bind(wx.adv.EVT_TASKBAR_LEFT_DOWN, self.on_left_down)    def CreatePopupMenu(self):        menu = wx.Menu()        create_menu_item(menu, 'Site', self.on_hello)        menu.AppendSeparator()        create_menu_item(menu, 'Exit', self.on_exit)        return menu    def set_icon(self, path):        icon = wx.Icon(path)        self.SetIcon(icon, TRAY_TOOLTIP)    def on_left_down(self, event):              print ('Tray icon was left-clicked.')    def on_hello(self, event):        print ('Hello, world!')    def on_exit(self, event):        wx.CallAfter(self.Destroy)        self.frame.Close()class App(wx.App):    def OnInit(self):        frame=wx.Frame(None)        self.SetTopWindow(frame)        TaskBarIcon(frame)        return Truedef main():    app = App(False)    app.MainLoop()if __name__ == '__main__':    main()