2013-03-21 3 views
2

Я разрабатываю графический интерфейс wxPython и хотел бы выравнивать текст ярлыка правой кнопкой. Очевидно, можно использовать это с помощью символов табуляции, но я бы предпочел сделать это изначально, если есть способ.выравнивание текста меню 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, чтобы убедиться, что все выстроено вверх, и в любое время, когда элемент меню изменяет имя или другой элемент, они все могут быть обновлены. Есть ли способ обойти это, например. метод класса, который я не вижу, чтобы автоматически связывать привязку к элементу меню?

Edit: Я знаю, что при передаче текста как &My menu item, он делает что-то автоматически с сочетанием клавиш, связанными с идентификатором, определенным, если существует определение, связанное с этим 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) 

Edit: обновляется в следующем разделе на основе Майк Дрисколл very helpful answer.

Обратите внимание, что это создает привязку ярлыков (wxPython выбирает это), но не делает ее выборкой, например, клавиша Alt в Windows.

можно связать клавишу Alt, чтобы быстро открыть меню и перейдите к нему с помощью амперсанд в вашем item_name текста, но вам все равно нужно связать нужный KeyBinding вручную через 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 для открытия меню File, а затем, если вы наберете еще одну букву, на которой был применен амперсанд, он перейдет к этому пункту меню, но & не связывает пункт меню в таблицу ускорителя. Это делается с помощью идентификатора элемента меню.

Смотрите следующий код:

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

Удивительный, и спасибо. Я уточню свой собственный ответ, чтобы быть более точным в свете информации, которую вы здесь указали. –

+0

Обратите внимание, что единственная причина, по которой я еще не принял это в качестве ответа, состоит в том, что это скорее ответ на мой первоначальный ответ, чем явный ответ на вопрос. –

+1

Нет проблем. Я не хотел переписывать все, что вы сказали, поскольку казалось, что я украду ваш ответ, поэтому я просто создал ответ «добавление» –

Смежные вопросы