【问题标题】:wxPython: scope of menu key shortcuts and dynamic disablingwxPython:菜单键快捷方式和动态禁用的范围
【发布时间】:2011-11-08 12:30:50
【问题描述】:

我在 Arch Linux x86_64 上使用 Python 2.7.2 和 wxPython 2.8.12.1。

我想让以下示例以这种方式工作:
* 当左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_FOCUSwx.EVT_SET_FOCUS 来绑定/取消绑定菜单项、设置/重置快捷键以及启用/禁用菜单项吗?对于大型应用程序来说这听起来很复杂,一般来说,我想知道 wxPython 应用程序限制菜单快捷键范围和动态启用/禁用菜单项的正确(最常见、最干净和整洁)的方式。

谢谢!

【问题讨论】:

    标签: python menu wxpython keyboard-shortcuts


    【解决方案1】:

    几年前我写了一篇关于菜单的文章:http://www.blog.pythonlibrary.org/2008/07/02/wxpython-working-with-menus-toolbars-and-accelerators/

    它谈到了在那里禁用菜单。 wxPython 演示包中还有一个关于此的示例。我认为您必须将菜单事件绑定到框架对象,但将它们绑定到文本控件可能不起作用。我确实认为焦点事件可能是一个更好的地方来做启用/禁用位。

    要取消绑定事件,请使用 UnBind 方法。请参阅http://zetcode.com/wxpython/events/http://www.wxpython.org/docs/api/wx.EvtHandler-class.html 了解更多信息。

    【讨论】:

    • 感谢所有这些参考,实际上我想做的最有趣的部分可能是您文章末尾的 Update 部分,其中提到了wxUpdateUIEvent:你知道一些我可以学习使用它的好例子吗?经过短暂的 Google 搜索后,我找不到很多...
    • 我并没有真正使用过它。我想我是从 wxPython 演示或邮件列表中得到的。也可以在那里问。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-19
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 2011-04-01
    • 2010-10-02
    • 1970-01-01
    相关资源
    最近更新 更多