wxPython: область сочетаний клавиш и динамическое отключение - PullRequest
0 голосов
/ 08 ноября 2011

Я использую Python 2.7.2 и wxPython 2.8.12.1 в Arch Linux x86_64.

Я бы хотел, чтобы следующий пример работал следующим образом:
* когда левый TextCtrl (text_A) имеет фокус, при нажатии Shift+A он должен выполнить do_A(), а при нажатии Shift+B он должен написать B в текстовой области; также menu.foo.bar_B должно быть отключено (и menu.foo.bar_A включено)
* когда правый TextCtrl (text_B) имеет фокус, при нажатии Shift+A он должен написать A в текстовой области, а при нажатии Shift+B он должен выполнить do_B(); также menu.foo.bar_A следует отключить (и menu.foo.bar_B включить)

import wx


class Foo(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, size=(600, 480))

        self.init_menu()
        self.init_text()

        self.Centre()
        self.Show(True)

    def init_menu(self):
        self.menu = wx.MenuBar()
        self.SetMenuBar(self.menu)

        self.menu.foo = wx.Menu()
        self.menu.Append(self.menu.foo, "&Foo")

        self.menu.foo.bar_A = self.menu.foo.Append(wx.ID_ANY, "Bar&A\tShift+A")
        self.menu.foo.bar_B = self.menu.foo.Append(wx.ID_ANY, "Bar&B\tShift+B")

        self.Bind(wx.EVT_MENU, self.handle_A, self.menu.foo.bar_A)
        self.Bind(wx.EVT_MENU, self.handle_B, self.menu.foo.bar_B)

    def init_text(self):
        self.box = wx.BoxSizer(wx.HORIZONTAL)
        self.SetSizer(self.box)

        self.text_A = wx.TextCtrl(self, style=wx.TE_MULTILINE)
        self.text_B = wx.TextCtrl(self, style=wx.TE_MULTILINE)

        self.box.Add(self.text_A, 1, flag=wx.EXPAND)
        self.box.Add(self.text_B, 1, flag=wx.EXPAND)

    def handle_A(self, event):
        print('A')

    def handle_B(self, event):
        print('B')

app = wx.App()
Foo()
app.MainLoop()

Привязка к событию меню с чем-то вроде self.text_A.Bind(wx.EVT_MENU, self.handle_A, self.menu.foo.bar_A) вообще не работает.

Должен ли я использовать wx.EVT_KILL_FOCUS и wx.EVT_SET_FOCUS для привязки / отмены привязки пунктов меню, установки / сброса сочетаний клавиш и включения / отключения записей меню? Это кажется сложным для больших приложений, в общем, я хотел бы знать, как правильно (чаще всего, чисто и аккуратно), как приложения wxPython ограничивают область сочетаний клавиш и динамически включают / отключают пункты меню.

Спасибо!

1 Ответ

1 голос
/ 08 ноября 2011

Несколько лет назад я написал статью о меню: http://www.blog.pythonlibrary.org/2008/07/02/wxpython-working-with-menus-toolbars-and-accelerators/

Это говорит об отключении меню там. Об этом также есть пример в демонстрационном пакете wxPython. Я думаю, что вы должны привязать события меню к объекту frame, хотя привязка их к текстовому элементу управления, вероятно, не будет работать Я думаю, что событие фокуса, вероятно, является лучшим местом для включения / выключения бита.

Чтобы отменить привязку события, используйте метод UnBind. См. http://zetcode.com/wxpython/events/ или http://www.wxpython.org/docs/api/wx.EvtHandler-class.html для получения дополнительной информации.

...