wxPython: как заставить значок панели задач реагировать на щелчок левой кнопкой мыши - PullRequest
1 голос
/ 13 июля 2010

Используя wxPython, я создал значок панели задач и меню.Все работает нормально (по крайней мере, в Windows) при щелчке правой кнопкой мыши по значку: то есть меню отображается и автоматически скрывается при щелчке в другом месте, как на панели задач Windows.

Теперь я хочучтобы меню появилось, когда по иконке также щелкнули левой кнопкой мыши.Поэтому я вставил Bind() в щелчок левой кнопкой мыши в оболочке класса Frame, вызвав 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 ]

4 голосов
/ 16 июля 2010

Ах, я обнаружил, что пошло не так.В заявлении

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

я привязал всплывающее меню к фрейму, а не к значку панели задач.

Изменив его на:

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

всесейчас работает хорошо.

Спасибо за все замечания

0 голосов
/ 16 июля 2010

Я думаю, что проблема здесь в том, что PopupMenu обычно используется в контексте программы, а не в виде маленького значка на панели задач. Это означает, что в обычном фрейме всплывающее меню будет определять щелчок, который вы щелкнули по нему. Здесь вы щелкаете за пределами программы wxPython. Кроме того, PopupMenu обычно используется с EVT_CONTEXT_MENU, а не с этим событием панели задач.

Вы можете попробовать wx.EVT_KILL_FOCUS и посмотреть, сработает ли это, поскольку оно теоретически должно срабатывать, когда вы выходите из меню. Или вы можете спросить на официальном форуме wxPython здесь: http://groups.google.com/group/wxpython-users/topics


Майк Дрисколл

Блог: http://blog.pythonlibrary.org

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...