Python气球提示不会显示在XP-wx GUI中

时间:2014-10-24 01:53:59

标签: python windows python-2.7 winapi

我有一个Python 2.7 Windows应用程序,其中包含一些在Windows 7中完美运行的Wx(3.0)gui功能....但我无法在Windows XP中使用系统托盘图标气球提示。我的公司仍在更新大约15,000台PC,并且要到明年年中才能完成,所以我希望在此之前将我的软件用于多个版本。

我已经搜索了大约一个星期,似乎找不到与我自己相同的情况,没有完全拆除我的整个程序并重新开始(也许那就是我需要做什么?)...其他解决方案涉及从win32gui重新创建所有窗口,而不是应用程序基础上的wx构建。 (我有一个弹出菜单,以及基于系统托盘菜单选择打开的多个面板)。我已经仔细检查过我的所有模块都是32位,但也许我错过了其他的东西?

我已经从我在这里找到的其他示例中获取了一些元素,以使其在W7中运行:

  def ShowBalloon(self, title, text, msec = 15, flags = 0):
    """
    Show Balloon tooltip
     @param title - Title for balloon tooltip
     @param msg   - Balloon tooltip text
     @param msec  - Timeout for balloon tooltip, in milliseconds
     @param flags -  one of wx.ICON_INFORMATION, wx.ICON_WARNING, wx.ICON_ERROR
    """
    self.icon = wx.Icon(os.getcwd() + "\Icons\Main.ico", wx.BITMAP_TYPE_ICO)
    if WIN32 and self.IsIconInstalled():
        try:
            self.__SetBalloonTip(self.icon.GetHandle(), title, text, msec, flags)
        except Exception as e:
          pass # print(e) Silent error

def __SetBalloonTip(self, hicon, title, msg, msec, flags):

    # translate flags
    print flags
    infoFlags = 0
    self.icon = wx.Icon(os.getcwd() + "\Icons\Main.ico", wx.BITMAP_TYPE_ICO)

    if flags & wx.ICON_INFORMATION:
        infoFlags |= win32gui.NIIF_INFO
    elif flags & wx.ICON_WARNING:
        infoFlags |= win32gui.NIIF_WARNING
    elif flags & wx.ICON_ERROR:
        infoFlags |= win32gui.NIIF_ERROR



    # Show balloon
    lpdata = (self.__GetIconHandle(),   # hWnd
              99,                       # ID
              win32gui.NIF_MESSAGE|win32gui.NIF_INFO|win32gui.NIF_ICON, # flags: Combination of NIF_* flags
              0,                        # CallbackMessage: Message id to be pass to hWnd when processing messages
              hicon,                    # hIcon: Handle to the icon to be displayed
              '',                       # Tip: Tooltip text
              msg,                      # Info: Balloon tooltip text
              msec,                     # Timeout: Timeout for balloon tooltip, in milliseconds
              title,                    # InfoTitle: Title for balloon tooltip
              infoFlags                 # InfoFlags: Combination of NIIF_* flags
              )
    win32gui.Shell_NotifyIcon(win32gui.NIM_MODIFY, lpdata)

    self.SetIcon(self.icon, self.tooltip)   # Hack: because we have no access to the real CallbackMessage value

def __GetIconHandle(self):
        """
        Find the icon window.
        This is ugly but for now there is no way to find this window directly from wx
        """
        if not hasattr(self, "_chwnd"):
            try:
                for handle in wx.GetTopLevelWindows():
                    if handle.GetWindowStyle():
                        continue
                    handle = handle.GetHandle()
                    if len(win32gui.GetWindowText(handle)) == 0:
                        self._chwnd = handle
                        break
                if not hasattr(self, "_chwnd"):
                    raise Exception
            except:
                raise Exception, "Icon window not found"
        return self._chwnd

我在XP中没有任何错误或异常,但气球提示不会显示。根据收到的传入TCP消息调用提示,并显示传入消息的详细信息。我是一个非常新手,提前谢谢你!

1 个答案:

答案 0 :(得分:0)

您可能想尝试使用内置于wxPython的BalloonTip小部件。它位于wx.lib.agw.balloontip。它不是原生的,因为它是一个自定义的小部件,但它应该适用于多个版本的Windows。

您可以在wxPython演示包中看到一个示例。这里还有一个简短的例子: