System Tray Icon

Plattformunabhängige GUIs mit wxWidgets.
Antworten
The Hit-Man
User
Beiträge: 435
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

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.
mathi
User
Beiträge: 314
Registriert: Dienstag 27. November 2007, 14:30

ich glaube wx.TaskBarIcon ist was Du suchst
The Hit-Man
User
Beiträge: 435
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

okidoki, ich schau mir das schnell mal an.
The Hit-Man
User
Beiträge: 435
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

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?
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

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()
The Hit-Man
User
Beiträge: 435
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

danke sehr !!! Das sieht viel verständlicher aus !
Antworten