代码之家  ›  专栏  ›  技术社区  ›  codebox

如何使用wxpython添加osx菜单栏图标

  •  4
  • codebox  · 技术社区  · 16 年前

    我想用wxpython在屏幕顶部的osx菜单栏添加一个图标。我尝试过wx.taskbaricon,它在Windows中添加了一个系统托盘图标,但这不起作用——它更改了应用程序的停靠图标。有人知道怎么做吗?

    3 回复  |  直到 11 年前
        1
  •  2
  •   Sridhar Ratnakumar    15 年前

    此处提供的答案 Google Groups 综上所述, 你做不到 .

        2
  •  2
  •   Heikki Toivonen    12 年前

    似乎有了wxpython2.9-osx-cocoa-py2.7,您实际上可以建立一个菜单栏图标。看起来你也可以打电话 PopupMenu() TaskBarIcon 要附加一个菜单,您应该能够使用它创建一个完整的OSX菜单栏应用程序。

    import wx
    
    class TaskBarFrame(wx.Frame):
        def __init__(self, parent):
            wx.Frame.__init__(self, parent, style=wx.FRAME_NO_TASKBAR |
                                                  wx.NO_FULL_REPAINT_ON_RESIZE)
    
            self.tbicon = wx.TaskBarIcon()
            icon = wx.Icon('myicon.ico', wx.BITMAP_TYPE_ICO)
            self.tbicon.SetIcon(icon, '')
    
    
    app = wx.App(False)
    frame = TaskBarFrame(None)
    frame.Show(False)
    app.MainLoop()
    
        3
  •  1
  •   Mehrad    11 年前

    现在看来你可以:

    http://wiki.wxpython.org/Custom%20Mac%20OsX%20Dock%20Bar%20Icon?highlight=%28wx%5C.TaskBarIcon%29

    只需复制粘贴代码并运行它;)

    #!/usr/bin/env pythonw
    
    import wx
    import wx.lib.embeddedimage
    
    WXPdemo = wx.lib.embeddedimage.PyEmbeddedImage(
        "iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAAAWlJ"
        "REFUWIW1V1sSwjAIBMebeBU9db2KZ8EPmxbCI4TUnXGskWaXDQktwhjErjERP4XRhER08iPi"
        "5SKiyQR5JyI7xxB3j7wn5GI6V2hFxM0gJtjYANFBiIjQu7L/1lYlwR0QxLDZhE0II1+CtwRC"
        "RI8riBva7DL7CC9VAwDbbxwKtdDXwBi7K+1zCP99T1vDFedd8FBwYd6BCAUXuACEF7QsbET/"
        "FaHs+gDQw4vOLNHkMojAnTw8nlNipIiwmR0DCXJbjCXkFCAL23BnpQgRWt1EMbyujCK9AZzZ"
        "f+b3sX0oSqJQ6EorFeT4NiL6Wtj0+LXnQAzThYoAAsN6ehqR3sHExmcEqGeFApQLcTvm5Kt9"
        "wkHGgb+RZwSkyc1dwOcpCtCoNKSz6FRCUQ3o7Nn+5Y+Lg+y5CIXlcyAk99ziiQS32+svz/UY"
        "vClJoLpIC8gi+VwwfDecEiEtT/WZTJDf94uk1Ru8vbz0cvoF7S2DnpeVL9UAAAAASUVORK5C"
        "YII=")
    
    class DemoTaskBarIcon(wx.TaskBarIcon):
        TBMENU_RESTORE = wx.NewId()
        TBMENU_CLOSE   = wx.NewId()
        TBMENU_CHANGE  = wx.NewId()
        TBMENU_REMOVE  = wx.NewId()
    
        def __init__(self, frame):
            wx.TaskBarIcon.__init__(self)
            self.frame = frame
    
            # Set the image
            icon = self.MakeIcon(WXPdemo.GetImage())
            self.SetIcon(icon, "wxPython Demo")
            self.imgidx = 1
    
            # bind some events
            self.Bind(wx.EVT_TASKBAR_LEFT_DCLICK, self.OnTaskBarActivate)
            self.Bind(wx.EVT_MENU, self.OnTaskBarActivate, id=self.TBMENU_RESTORE)
            self.Bind(wx.EVT_MENU, self.OnTaskBarClose, id=self.TBMENU_CLOSE)
    
    
        def CreatePopupMenu(self):
            """
            This method is called by the base class when it needs to popup
            the menu for the default EVT_RIGHT_DOWN event.  Just create
            the menu how you want it and return it from this function,
            the base class takes care of the rest.
            """
            menu = wx.Menu()
            menu.Append(self.TBMENU_RESTORE, "Restore wxPython Demo")
            menu.Append(self.TBMENU_CLOSE,   "Close wxPython Demo")
            return menu
    
    
        def MakeIcon(self, img):
            """
            The various platforms have different requirements for the
            icon size...
            """
            if "wxMSW" in wx.PlatformInfo:
                img = img.Scale(16, 16)
            elif "wxGTK" in wx.PlatformInfo:
                img = img.Scale(22, 22)
            # wxMac can be any size upto 128x128, so leave the source img alone....
            icon = wx.IconFromBitmap(img.ConvertToBitmap() )
            return icon
    
    
        def OnTaskBarActivate(self, evt):
            if self.frame.IsIconized():
                self.frame.Iconize(False)
            if not self.frame.IsShown():
                self.frame.Show(True)
            self.frame.Raise()
    
    
        def OnTaskBarClose(self, evt):
            wx.CallAfter(self.frame.Close)
    
    
    
    class MainFrame(wx.Frame):
        def __init__(self, parent):
            wx.Frame.__init__(self, parent, title="Hello World")
            self.tbicon = DemoTaskBarIcon(self)
            self.Bind(wx.EVT_CLOSE, self.OnCloseWindow)
    
        def OnCloseWindow(self, evt):
            self.tbicon.Destroy()
            evt.Skip()
    
    
    app = wx.App(redirect=False)
    frame = MainFrame(None)
    frame.Show(True)
    app.MainLoop()