繁体   English   中英

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

[英]wxPython: how to make taskbar icon respond to left-click

使用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或类似的东西)。

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

编辑 :我已经插入了更多的代码,以使其更清晰

啊,我发现了什么问题。 在声明中

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

我将弹出菜单绑定到框架,而不是任务栏图标。

通过将其更改为:

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

现在一切都很好。

感谢所有的评论

我认为这里的问题是PopupMenu通常用在程序的上下文中,而不是系统托盘中的小图标。 这意味着在普通框架中,弹出菜单会检测到您点击它的点击。 在这里,您点击了wxPython程序的外部。 此外,PopupMenu通常与EVT_CONTEXT_MENU一起使用,而不是此任务栏事件。

您可以尝试wx.EVT_KILL_FOCUS并查看是否有效,因为当您单击菜单时它理论上应该触发。 或者您可以在官方wxPython论坛上询问: http//groups.google.com/group/wxpython-users/topics


迈克德里斯科尔

博客: http//blog.pythonlibrary.org

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM