System Tray Icon
Verfasst: Freitag 6. November 2009, 09:01
Vor einiger Zeit hatte ich mir mit der bash und zenity ein kleines Script zusammen gekloppt, mit dem unseren Exchange Server über das Webinterface nach neuen Emails abfragen konnte, so alle 5 Minuten. Wenn eine Email dann da war, bekam ich unten in der Taskleiste ( hatte damals den LxDe Fenstermanager ) ein Icon angezeigt. Nun nutze ich Windows, und möchte dieses ganz gerne auch mit Python programmieren, allerdings habe ich bis jetzt keine Ahnung, wie ich mit wxPython ein solches Tray Icon in die Taskleiste bekomme. Im Netz habe ich dieses Script gefunden, blicke da aber leider nicht durch. Kann mir jemand nen Tip geben? das Icon muß nicht blinken, oder sich bewegen, wie in diesem Beispiel Script.
bin recht neu mit wxPython, daher würde mir jeder Tip helfen.
Code: Alles auswählen
import wx
import string
import sys
ID_ICON_TIMER = wx.NewId()
##
# The IconBar class
#
class IconBar:
##
# \brief the constructor default left: red, default right: green
#
def __init__(self,l_off=[128,0,0],l_on=[255,0,0],r_off=[0,128,0],r_on=[0,255,0]):
self.s_line = "\xff\xff\xff"+"\0"*45
self.s_border = "\xff\xff\xff\0\0\0"
self.s_point = "\0"*3
self.sl_off = string.join(map(chr,l_off),'')*6
self.sl_on = string.join(map(chr,l_on),'')*6
self.sr_off = string.join(map(chr,r_off),'')*6
self.sr_on = string.join(map(chr,r_on),'')*6
##
# \brief gets a new icon with 0 <= l,r <= 5
#
def Get(self,l,r):
s=""+self.s_line
for i in range(5):
if i<(5-l):
sl = self.sl_off
else:
sl = self.sl_on
if i<(5-r):
sr = self.sr_off
else:
sr = self.sr_on
s+=self.s_border+sl+self.s_point+sr+self.s_point
s+=self.s_border+sl+self.s_point+sr+self.s_point
s+=self.s_line
image = wx.EmptyImage(16,16)
image.SetData(s)
bmp = image.ConvertToBitmap()
bmp.SetMask(wx.Mask(bmp, wx.WHITE)) #sets the transparency colour to white
icon = wx.EmptyIcon()
icon.CopyFromBitmap(bmp)
return icon
##
# The TaskBarIcon class
#
class MyTaskBarIcon(wx.TaskBarIcon):
l = 0
r = 0
##
# \brief the constructor
#
def __init__(self, frame):
wx.TaskBarIcon.__init__(self)
self.frame = frame
self.IconBar = IconBar((127,127,0),(255,255,0),(0,127,127),(0,255,255))
self.SetIconBar(self.l,self.r)
##
# \brief sets the icon timer
#
def SetIconTimer(self):
self.icon_timer = wx.Timer(self, ID_ICON_TIMER)
wx.EVT_TIMER(self, ID_ICON_TIMER, self.BlinkIcon)
self.icon_timer.Start(100)
##
# \brief blinks the icon and updates self.l and self.r
#
def BlinkIcon(self, event):
self.SetIconBar(self.l,self.r)
self.l += 1
if self.l > 5:
self.l = 0
self.r += 1
if self.r > 5:
self.r = 0
##
# \brief sets the icon bar and a message
#
def SetIconBar(self,l,r):
icon = self.IconBar.Get(l,r)
self.SetIcon(icon, "L:%d,R:%d"%(l,r))
##
# The task bar application
#
class TaskBarApp(wx.Frame):
##
# \brief the constructor
#
def __init__(self, parent, id, title):
wx.Frame.__init__(self, parent, -1, title, size = (1, 1),
style=wx.FRAME_NO_TASKBAR|wx.NO_FULL_REPAINT_ON_RESIZE)
self.tbicon = MyTaskBarIcon(self)
self.tbicon.SetIconTimer()
self.Show(True)
##
# The main application wx.App class
#
class MyApp(wx.App):
def OnInit(self):
frame = TaskBarApp(None, -1, ' ')
frame.Center(wx.BOTH)
frame.Show(False)
return True
def main(argv=None):
if argv is None:
argv = sys.argv
app = MyApp(0)
app.MainLoop()
if __name__ == '__main__':
main()