【问题标题】:How to add OSX menu bar icon with wxPython如何使用 wxPython 添加 OSX 菜单栏图标
【发布时间】:2010-05-12 19:20:35
【问题描述】:

我想使用 wxPython 在屏幕顶部的 OSX 菜单栏中添加一个图标。我已经尝试过 wx.TaskBarIcon,它在 Windows 中添加了一个系统托盘图标,但这不起作用 - 它会更改应用程序的 Dock 图标。有谁知道怎么做?

【问题讨论】:

  • 您的意思是要将屏幕左上角的 Apple 图标替换为另一个图标吗?我还没有看到任何 OSX 程序可以做到这一点,所以我认为 wxPython 也无法做到。
  • 不,我想在屏幕右上角添加一个新图标,靠近时钟、电池和 wi-fi 状态图标出现的位置。这一定是可能的,因为我有许多其他应用程序(Dropbox、gmail 通知程序等)。

标签: python macos wxpython taskbar menubar


【解决方案1】:

似乎使用 wxPython2.9-osx-cocoa-py2.7 实际上你可以放置一个菜单栏图标。看起来你也可以在TaskBarIcon 上调用PopupMenu() 来附加一个菜单,你应该可以使用它来创建一个完整的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()

【讨论】:

    【解决方案2】:

    Google Groups 上提供的答案 - 总之,你做不到

    【讨论】:

      【解决方案3】:

      现在看来你可以了:

      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()
      

      【讨论】:

        猜你喜欢
        • 2020-02-14
        • 2010-09-13
        • 2012-07-12
        • 1970-01-01
        • 2021-11-21
        • 1970-01-01
        • 2020-02-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多