Seite 1 von 1

System Tray Icon

Verfasst: Freitag 6. November 2009, 09:01
von The Hit-Man
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.

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()
bin recht neu mit wxPython, daher würde mir jeder Tip helfen.

Verfasst: Freitag 6. November 2009, 10:37
von mathi
ich glaube wx.TaskBarIcon ist was Du suchst

Verfasst: Freitag 6. November 2009, 13:24
von The Hit-Man
okidoki, ich schau mir das schnell mal an.

Verfasst: Freitag 6. November 2009, 14:30
von The Hit-Man
Mensch, da habe ich wohl gerade irgendwie nen Brett vorm Kopf :( Checke gerade den gesammten Code gar nicht mehr. Für das Tray Icon, muß ich als Muttercontainer, erst ein Form benutzen oder kann ich das gleich in die Taskleiste schieben?

Verfasst: Freitag 6. November 2009, 18:13
von Sr4l
Hier mal ein gekürztes bsp aus nem eigenen Programm sollte aber recht nah an dem wxPython Beispiel sein.

Code: Alles auswählen

import wx

class TaskbarIcon(wx.TaskBarIcon):
    def __init__(self, app):
        wx.TaskBarIcon.__init__(self)
        self.app = app
        self.SetIcon(wx.Icon('data/icon.png', wx.BITMAP_TYPE_PNG), 'Klamm')
        self.Bind(wx.EVT_MENU, self.OnTaskbarFrametoggle, id=1)
        self.Bind(wx.EVT_MENU, self.OnTaskbarClose, id=2)
       

    def CreatePopupMenu(self):
        menu = wx.Menu()
        menu.Append(1, 'Show / Hide')
        menu.Append(2, 'Close')
        return menu

    def OnTaskbarFrametoggle(self, event):
        if not self.app.frame.IsShown():
            self.app.frame.Show()
        else:
            self.app.frame.Hide()
   
    def OnTaskbarClose(self, event):
        self.app.frame.Destroy()
        self.Destroy()

class Frame(wx.Frame):
    def __init__(self, app, parent, id, title):
        wx.Frame.__init__(self, parent, id, title, (-1, -1), (290, 280))
        self.Centre()

class App(wx.App):
    def OnInit(self):
        self.frame = Frame(self, None, -1, ':-D')
        self.taskb = TaskbarIcon(self)
        self.frame.Show(False)
        return True

app = App(0)
app.MainLoop()

Verfasst: Freitag 6. November 2009, 19:30
von The Hit-Man
danke sehr !!! Das sieht viel verständlicher aus !