gpt4 book ai didi

python - 无法在 wxPython 中正确使用 wx.NotificationMessage

转载 作者:太空狗 更新时间:2023-10-29 22:07:09 27 4
gpt4 key购买 nike

我最近升级到 wxPython 的开发版本(wxPython 2.9.2.4),因为我需要在我的应用程序中使用 wx.NotificationMessage 的功能。由于我认为可能是一个错误,我一直试图在某些用户事件上创建通知气泡,但没有成功。在提交此类错误之前,我想先询问邮件列表中的人他们认为可能是什么问题,并希望从我的代码中找到解决方案。

这是我使用的代码:

import wx, sys

app = wx.PySimpleApp()

class TestTaskBarIcon(wx.TaskBarIcon):

def __init__(self):
wx.TaskBarIcon.__init__(self)
# create a test icon
bmp = wx.EmptyBitmap(16, 16)
dc = wx.MemoryDC(bmp)
dc.SetBrush(wx.RED_BRUSH)
dc.Clear()
dc.SelectObject(wx.NullBitmap)

testicon = wx.EmptyIcon()
testicon.CopyFromBitmap(bmp)

self.SetIcon(testicon)
self.Bind(wx.EVT_TASKBAR_LEFT_UP, lambda e: (self.RemoveIcon(),sys.exit()))

wx.NotificationMessage("", "Hello world!").Show()

icon = TestTaskBarIcon()
app.MainLoop()

在我的 Windows 7 计算机上,代码创建了一个白色的小任务栏图标,并创建了一个带有短语“Hello World!”的弹出窗口。问题?该消息不在我的图标上。正在创建另一个图标并将消息放置在那里。看这张图片:http://www.pasteall.org/pic/18068">

我的想法是,这可能是因为我在第 22 行没有传递父参数:

wx.NotificationMessage("", "Hello world!").Show()

我把它改成了:

wx.NotificationMessage("", "Hello world!", self).Show()

其中“self”指的是任务栏图标。当我这样做时,出现错误:

Traceback (most recent call last):
File "C:\Python27\testnotificationmessage.py", line 24, in <module>
icon = TestTaskBarIcon()
File "C:\Python27\testnotificationmessage.py", line 22, in __init__
wx.NotificationMessage("", "Hello world!", self).Show()
File "C:\Python27\lib\site-packages\wx-2.9.2-msw\wx\_misc.py", line 1213, in __init__
_misc_.NotificationMessage_swiginit(self,_misc_.new_NotificationMessage(*args))
TypeError: in method 'new_NotificationMessage', expected argument 3 of type 'wxWindow *'

这是怎么回事?如果删除该参数,则不会得到结果,如果添加参数,则会出现错误!我应该如何将 wx.NotificationMessage 与 wx.TaskBarIcon 一起使用!

求助!我希望我已经提供了足够的细节。如果您需要更多,请发表评论!

最佳答案

我目前还不推荐使用 2.9。我在尝试时遇到了一些奇怪的错误。

您可以在 2.8 中拥有相同的功能。我使用的是一段时间前发现的稍微修改过的代码。

import wx, sys

try:
import win32gui #, win32con
WIN32 = True
except:
WIN32 = False

class BalloonTaskBarIcon(wx.TaskBarIcon):
"""
Base Taskbar Icon Class
"""
def __init__(self):
wx.TaskBarIcon.__init__(self)
self.icon = None
self.tooltip = ""

def ShowBalloon(self, title, text, msec = 0, 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
"""
if WIN32 and self.IsIconInstalled():
try:
self.__SetBalloonTip(self.icon.GetHandle(), title, text, msec, flags)
except Exception:
pass # print(e) Silent error

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

# translate flags
infoFlags = 0

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

def SetIcon(self, icon, tooltip = ""):
self.icon = icon
self.tooltip = tooltip
wx.TaskBarIcon.SetIcon(self, icon, tooltip)

def RemoveIcon(self):
self.icon = None
self.tooltip = ""
wx.TaskBarIcon.RemoveIcon(self)

# ===================================================================
app = wx.PySimpleApp()

class TestTaskBarIcon(BalloonTaskBarIcon):

def __init__(self):
wx.TaskBarIcon.__init__(self)
# create a test icon
bmp = wx.EmptyBitmap(16, 16)
dc = wx.MemoryDC(bmp)
dc.SetBrush(wx.RED_BRUSH)
dc.Clear()
dc.SelectObject(wx.NullBitmap)

testicon = wx.EmptyIcon()
testicon.CopyFromBitmap(bmp)

self.SetIcon(testicon)
self.Bind(wx.EVT_TASKBAR_LEFT_UP, lambda e: (self.RemoveIcon(),sys.exit()))

self.ShowBalloon("", "Hello world!")

icon = TestTaskBarIcon()
app.MainLoop()

关于python - 无法在 wxPython 中正确使用 wx.NotificationMessage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7523511/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com