当前位置: 首页 > 面试题库 >

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

陶唯
2023-03-14
问题内容

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

这是我使用的代码:

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

“自我”是指任务栏图标。当我这样做时,我得到一个错误:

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


 类似资料:
  • 问题内容: 我是一个新用户,正在尝试此命令。 我得到这个错误 我知道这似乎是一个琐碎的问题,但我坚持下去。 问题答案: 如果编译和安装的代码是 不是 在分支(签出由默认值),但只有在该回购的分支,尝试: 然后重试编译。

  • 我的AUT有不同的选项卡来测试和验证不同的WebElements,这些选项卡上有几乎相同的属性。我需要验证一个下拉搜索框,并验证下拉列表中的选项。我的脚本找不到这个下拉搜索框,而xpath在firebug中工作得非常好,可以识别搜索框。 显示的错误为: 请告诉我什么可能是错误的,以及为什么Selenium不能使用xpath定位元素,而它在xpath中运行良好。另外,如果我的xpath不正确,请告诉

  • 问题内容: 我正在运行Nutch 2.3.1,Mongodb 3.2.9和Elasticsearch 2.4.1。我遵循了本教程的内容: https://qbox.io/blog/scraping-the-web-with-nutch-for- elasticsearch 和本教程: http://www.aossama.com/search-engine-with-apache-nutch-mo

  • 问题内容: 我目前正在使用HtmlUnit开发一些测试。它正在加载一个包含braintree.js(其表单加密库)的页面。我跑了一堆,但我被困在所谓的加密货币上。有问题的JS是: HtmlUnit抛出: 我想HtmlUnit不包含加密。我自己可以包括一个密码库吗? 问题答案: 根据您的评论,我不得不告诉您HtmlUnit在涉及JavaScript时令人不安。它将抱怨很多关于变量未定义和未知函数等问

  • 问题内容: 我刚刚在我的项目中发现了一些这样的sql查询构建: 这是否达到其目标,即减少内存使用量? 我对此表示怀疑,因为在构造函数中使用了“ +”(字符串concat运算符)。像下面的代码那样,将占用与使用String相同的内存量吗?我了解,使用时有所不同。 两条语句的内存使用量是否相等?请澄清。 提前致谢! 编辑: 顺便说一句, 这不是我的代码 。在一个旧项目中发现它。而且,查询的大小不如我的

  • 请读到最后(我在最后提到console.log) 模型: 收藏: 观点: 在我们的应用程序中。js 服务器输出 我还尝试从模型中删除所有属性防御。还是不行。返回值内容类型为:application/json(已验证),并且是有效的json。 我读过:Backbonejs集合长度总是零 但尽管console.log,显示0长度,也: 不工作! 我还读了Did主干收集自动解析加载的数据 非常感谢 更新

  • 在JavaFX中,我使用ListView显示添加到集合或从集合中移除的项目。我已经创建了一个observableSet,用于与ListView一起显示更新,但当集合更改时,ListView没有正确更新。这是我的代码和解决方法。但为什么它没有按预期工作? 问题:每次更新可观察集时,我必须继续设置ListView,如上图和下图所示。否则更改不会显示在ListView中。

  • 我不知道为什么我的json解析不起作用。这是我正在使用的Api。还有完整json输出的链接http://api.openweathermap.org/data/2.5/forecast/daily?zip=85008 我试图得到每天的最低和最高温度。这是我的代码。引发的异常应该是BEGIN_OBJECT,但在第1行第190列编号。任何帮助不胜感激,谢谢!