【问题标题】:wxPython menu text alignmentwxPython 菜单文本对齐
【发布时间】:2013-03-21 15:52:22
【问题描述】:

我正在开发一个 wxPython GUI,并且想右对齐快捷方式文本。显然,可以使用制表符来解决这个问题,但如果有办法,我更愿意在本地进行。

默认的菜单项创建如下:

menu = wx.Menu()
item_id = 1
item_name = 'My menu item'
help_text = 'Clicking this does something interesting.'
item = menu.Append(item_id, item_name, help_text)

我将使用快捷方式对此进行扩展,所以如果我使用标签,它会是这样的:

item_name = 'My menu item\t\tCtrl+Alt+H'

但是,这涉及大量手动 \t 条目以确保所有内容都对齐,并且每当菜单项更改名称或添加其他项时,它们都可能需要更新。有没有办法解决这个问题,例如我没有看到自动将键绑定与菜单项关联的类方法?

编辑:我知道当传递像&My menu item 这样的文本时,它会自动做一些事情 与指定的ID 相关联的键绑定(如果有与之相关的定义)加速器表中的 ID,对吗?

【问题讨论】:

  • 答案见下文。如果这两天有人写的比我写的好,我很乐意接受。

标签: python menu wxpython keyboard-shortcuts


【解决方案1】:

我深入研究了其他几个应用程序的代码以找到答案。事实证明,\t 的默认行为并没有像它看起来那样做(即插入一个制表符),但被工具包明智地解释为正在做我想做的事情做。因此,右对齐快捷方式的方法很简单:使用您想要的文本创建它,然后是\t<shortcut>(就像我上面所说的那样)。在我上面粘贴的示例代码中,如果我希望我的快捷方式是 Ctrl + T,那么它应该是这样的:

menu = wx.Menu()
item_id = 1
item_name = 'My menu item\tCtrl+T'
help_text = 'Clicking this does something interesting.'
item = menu.Append(item_id, item_name, help_text)

编辑:根据 Mike Driscoll 的 very helpful answer 更新了以下部分。

请注意,这会创建快捷方式绑定(wxPython 会选择它),但它不会使用例如Windows 上的 Alt 键。

您可以关联 Alt 键以快速打开菜单并使用 item_name 文本中的 & 号导航到该菜单,但您仍需要通过 AcceleratorTable 手动关联所需的键绑定:

menu = wx.Menu()
item_id = 1

# Ctrl+T is bound to the keybinding
accelerator_table = wx.AcceleratorTable([(wx.ACCEL_CTRL, ord('T'), item_id)])
self.setAcceleratorTable(accelerator_table)

# Ctrl+T is not included, but the menu item can be accessed via Alt key
item_name = '&My menu item'

help_text = 'Clicking this does something interesting.'
item = menu.Append(item_id, item_name, help_text)

我想,这实际上是首选模式,因为在任何引用 item_id 的地方,都可以自动引用快捷方式。这也有助于无缝更新。

【讨论】:

    【解决方案2】:

    虽然 Chris 关于在菜单中正确缩进键绑定的“\t”是正确的,但我真的不明白他所说的 自动 使用 & 符号关联任何东西的意思。与号 (&) 确实允许用于键入 ALT 以打开文件菜单,然后如果您键入另一个应用了与号的字母,它将跳转到该菜单项,但 & 不连接加速器表的菜单项。这是通过菜单项的 ID 完成的。

    见以下代码:

    import wx
    
    ########################################################################
    class MyForm(wx.Frame):
    
        #----------------------------------------------------------------------
        def __init__(self):
            wx.Frame.__init__(self, None, wx.ID_ANY, "wx.Menu Tutorial")
    
            self.panel = wx.Panel(self, wx.ID_ANY)
    
            menuBar = wx.MenuBar()
            fileMenu = wx.Menu()
            exitId = wx.NewId()
            exitMenuItem = fileMenu.Append(exitId, "&Exit/tCtrl+X",
                                           "Exit the application")
            self.Bind(wx.EVT_MENU, self.onExit, id=exitId )
            menuBar.Append(fileMenu, "&File")
            self.SetMenuBar(menuBar)
    
            accel_tbl = wx.AcceleratorTable([(wx.ACCEL_CTRL,  ord('X'), exitId )])
            self.SetAcceleratorTable(accel_tbl)
    
        #----------------------------------------------------------------------
        def onExit(self, event):
            """"""
            self.Close()
    
    # Run the program
    if __name__ == "__main__":
        app = wx.App(False)
        frame = MyForm().Show()
        app.MainLoop()
    

    注意exitId用于创建菜单项,将菜单项绑定到EVT_MENU,最后在AcceleratorTable中使用,方便用户使用快捷键。

    以下是一些可能有用的参考资料:

    【讨论】:

    • 太棒了,谢谢。我也会根据您在此处提供的信息调整我自己的答案,使其更准确。
    • 请注意,我还没有接受这个作为答案的唯一原因是因为它更像是对我最初的回答的回应,而不是对问题的明确回答。
    • 没问题。我不想重写你所说的一切,因为那似乎我会窃取你的答案,所以我只是创建了一个“附录”答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多