我有一个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消息调用提示,并显示传入消息的详细信息。我是一个非常新手,提前谢谢你!
答案 0 :(得分:0)
您可能想尝试使用内置于wxPython的BalloonTip
小部件。它位于wx.lib.agw.balloontip
。它不是原生的,因为它是一个自定义的小部件,但它应该适用于多个版本的Windows。
您可以在wxPython演示包中看到一个示例。这里还有一个简短的例子: