我正在开发一个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,是否正确?
答案 0 :(得分:2)
我开始挖掘其他几个应用程序的代码来找到答案。事实证明,\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
的任何地方,快捷方式都可以自动引用。这也可以实现无缝更新。
答案 1 :(得分:1)
虽然Chris正确地在菜单中正确地缩进了键盘绑定,但我并没有真正看到自动使用&符号关联任何内容的含义。 &符号(&amp;)DOES允许用户键入ALT以打开文件菜单,然后如果您键入另一个已经应用了&符号的字母,它将跳转到该菜单项,但&amp;不将菜单项连接到加速器表。这是通过菜单项的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中使用,以便用户可以使用快捷键。
以下是一些可能有用的参考资料: