2013-03-21 101 views
2

我正在開發一個wxPython GUI,並且想要對齊快捷方式文本。很明顯,人們可以使用製表符來對此進行整理,但如果有辦法,我寧願本地執行它。wxPython菜單文本對齊

默認菜單項的創建是這樣的:

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

的回答,請參閱下文。如果有人在接下來的兩天內比我自己的寫作更好,我會很樂意接受它。 – 2013-03-21 16:26:19

回答

2

我去挖掘一些其他應用程序的代碼來找到答案。事實證明,\t的默認行爲並不像看起來那樣(即插入一個製表符),而是被工具包理性地解釋爲正在做我想做的事情。因此,將快捷方式右對齊的方法很簡單:使用您想要的文本創建它,然後按\t<shortcut>(而不是像上面那樣)創建它。基於邁克·德里斯科爾的very helpful answer更新以下部分:在示例代碼我上面粘貼,如果我想我的快捷方式是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) 

編輯。

請注意,這會創建快捷方式綁定(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

雖然克里斯是正確的「\ 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被使用,因此用戶可以使用快捷鍵。

這裏有幾個引用可能會有所幫助:

+0

太棒了,謝謝。根據你在這裏提供的信息,我會調整我自己的答案,以便更準確。 – 2013-03-21 19:36:58

+0

請注意,我還沒有接受這個答案的唯一原因是因爲它更多的是對我的初步答案的迴應,而不是對問題的明確回答。 – 2013-03-21 19:49:21

+1

沒問題。我不想重寫所有你說的話,因爲這好像我會偷你的答案,所以我只是創建了一個「附錄」答案 – 2013-03-21 20:38:27