wxPython:如何让任务栏图标响应左键点击

1 投票
2 回答
3753 浏览
提问于 2025-04-16 01:12

我使用wxPython创建了一个任务栏图标和菜单。右键点击图标时,一切都正常(至少在Windows上是这样):菜单会显示出来,当你点击其他地方,比如Windows的任务栏时,菜单会自动隐藏。

现在我想让菜单在左键点击图标时也能出现。所以我在Frame类中添加了一个Bind(),把左键点击事件和任务栏图标的CreatePopupMenu()连接起来:

import wx
class BibTaskBarIcon(wx.TaskBarIcon):
    def __init__(self, frame):
        wx.TaskBarIcon.__init__(self)
        self.frame = frame
        icon = wx.Icon('test_icon.ico', wx.BITMAP_TYPE_ICO)
        self.SetIcon(icon, "title")

    def CreatePopupMenu(self):
        self.menu = wx.Menu()
        self.menu.Append(wx.NewId(), "dummy menu ")
        self.menu.Append(wx.NewId(), "dummy menu 2")
        return self.menu

class TaskBarFrame(wx.Frame):
    def __init__(self, parent, title):
        wx.Frame.__init__(self, parent, style=wx.FRAME_NO_TASKBAR)
        ...
        self.tbicon = BibTaskBarIcon(self)
        wx.EVT_TASKBAR_LEFT_UP(self.tbicon, self.OnTaskBarLeftClick)
        ...

    def OnTaskBarLeftClick(self, evt):
        self.PopupMenu(self.tbicon.CreatePopupMenu())

    ...
def main(argv=None):
    app = wx.App(False)
    TaskBarFrame(None, "testing frame")
    app.MainLoop()

这样做是有效的,但有一个问题菜单在你点击屏幕其他地方时不会自动消失。实际上,如果你多次左键点击图标,会出现多个菜单。隐藏这些菜单的唯一方法就是点击菜单中的某个选项(但这并不是你总是想要的)。我查看了TaskbarIcon的可用方法,但不清楚该用哪个方法来隐藏菜单(.Destroy()没有效果)。而且,我也不知道该把它绑定到哪个事件上(有一个EVT_SET_FOCUS,但我找不到类似EVT_LOOSE_FOCUS的事件)。

那么,如何在失去焦点时隐藏菜单呢?

编辑:我添加了一些代码,以便让问题更清楚。

2 个回答

0

我觉得这里的问题在于,弹出菜单(PopupMenu)通常是在程序的上下文中使用的,而不是在系统托盘的小图标上。这是什么意思呢?在正常的窗口中,弹出菜单会检测到你点击它以外的地方。但是在这里,你是点击了wxPython程序外面的地方。此外,弹出菜单通常是和EVT_CONTEXT_MENU一起使用的,而不是这个任务栏事件。

你可以试试wx.EVT_KILL_FOCUS,看看是否有效,因为理论上当你点击菜单外面的时候,它应该会触发。或者你也可以在官方的wxPython论坛上问问:http://groups.google.com/group/wxpython-users/topics


Mike Driscoll

博客:http://blog.pythonlibrary.org

4

啊,我发现问题出在哪里了。在这段代码中:

self.PopupMenu(self.tbicon.CreatePopupMenu())

我把弹出菜单绑定到了窗口上,而不是绑定到任务栏图标上。

通过把它改成:

self.tbicon.PopupMenu(self.tbicon.CreatePopupMenu())

现在一切都正常了。

谢谢大家的建议。

撰写回答