Рубрики
Без рубрики

WXPYPHON: Работа с меню, панель инструментов и ускорителей

Получите практические, реальные навыки Python на наших ресурсах и пути

Автор оригинала: Mike Driscoll.

Меню и панели инструментов используются практически во всех современных программе, запрещающих те, которые проходят только из командной строки. В этом посте мы научимся создавать их, используя инструментарий WXPYPHON. Вот что вам нужно будет следовать вдоль:

  • Python 2.3 – 2.5
  • wxpython (Я рекомендую 2.7 или выше)

Создание меню

Во-первых, мы посмотрим на детали, которые составляют меню. Основание системы меню в WXPYPHON является объектом WX.Menubar. По мере того, как его название подразумевает, он создает бар на меню. Следующая часть головоломки – это объект wx.menu. Это в основном слова, которые вы видите в вашей строке меню, такие как «Файл» и «Редактирование». Предметы под объектом WX.MENU создаются с помощью метода Append метода объекта меню, который вы создаете. См. В следующем примере:

import wx
 
class MyForm(wx.Frame):
 
    def __init__(self):
        wx.Frame.__init__(self, None, wx.ID_ANY, "wx.Menu Tutorial")
 
        # Add a panel so it looks the correct on all platforms
        self.panel = wx.Panel(self, wx.ID_ANY)
 
        menuBar = wx.MenuBar()
        fileMenu = wx.Menu()
        exitMenuItem = fileMenu.Append(wx.NewId(), "Exit",
                                       "Exit the application")
        menuBar.Append(fileMenu, "&File")
        self.SetMenuBar(menuBar)
 
# Run the program
if __name__ == "__main__":
    app = wx.PySimpleApp()
    frame = MyForm().Show()
    app.MainLoop()

Ваше приложение теперь должно выглядеть что-то подобное:

Обратите внимание на три аргумента для создания пункта меню:

fileMenu.Append(wx.NewId(), "Exit",  "Exit the application")

Вам нужен идентификатор, этикетка и описание. Описание появится в строке состояния, если вы создали один.

В последнее время на списке рассылки WXPYPHON, который хочет отключить предметы в меню или целых меню. Для этого мы должны использовать счетчитные именованные методы, включить () и EnableTOP () соответственно. Метод включения () является частью способов пункта меню, тогда как Enabletop () должен вызывать объект Menubar. Теперь будьте осторожны здесь, так как вам нужно прикрепить меню на кадре, прежде чем вы сможете отключить все меню.

Давайте посмотрим на какой-то код. На основании моего источника вы можете сделать что-то подобное, чтобы отключить элемент «Выход» в меню «Файл»:

exitMenuItem.Enable(False)

Если вы хотите отключить весь меню «Файл», вы сделаете это:

self.menuBar.EnableTop(0, False)

Как видите, создание меню с wxpython довольно простым и прямым. Теперь давайте связываем обработчик событий в пункт меню «Выход» или ничего не сделает. Привязка события к пункту меню намного такое же, как связывание события для чего-либо еще в Wxpython. Я покажу вам самый простой способ, а также способ, которым это делает это.

Самый быстрый способ – просто связываться с событием EVT_MENU, как это:

self.Bind(wx.EVT_MENU, self.onExit, exitMenuItem)

Однако, если у вас есть много пунктов меню, это очень быстро становится утомительным. Таким образом, мне нравится метод, который я нашел в демонстрации WXPYPHON создания вложенного метода для этого для меня. Общая методология состоит в том, чтобы поместить следующий код в один из ваших методов:

def doBind(item, handler):
        ''' Create menu events. '''
        self.Bind(wx.EVT_MENU, handler, item)

Я обычно создаю свои меню в своей собственной функции, которую я звоню из конструктора __init__. Если вы сделаете это таким образом, то ваш код должен в конечном итоге выглядеть что-то вроде фрагмента:

def createMenu(self):
    """ Create the menu bar. """
    def doBind(item, handler):
        """ Create menu events. """
        self.Bind(wx.EVT_MENU, handler, item)
    
    doBind( fileMenu.Append(wx.ID_ANY, "&Exit\tAlt+F4", "ExitProgram"),
            self.onExit)

Наконец, вы можете захотеть горизонтальную линию, чтобы отделить некоторые элементы в вашем меню. Чтобы добавить один, позвоните в MENU MENU IMPENDSEPARATOR ():

fileMenu.AppendSeparator()

Создание панелей инструментов

Использование функциональности панели инструментов WXPYPHON тоже очень просто. Чтобы инициализировать панель инструментов, все, что вам нужно сделать, это позвонить WX.createToolbar (). Я также устанавливаю размеры значков панели инструментов, используя метод SettOllbitmapsize (). Панель инструментов также могут иметь разделители, но вы используете Adsparator () панели инструментов (), а не приложениеPasparator ().

Давайте посмотрим на какой-нибудь код, чтобы вы могли видеть это лучше. Вот мой метод CreateToolbar:

def createToolbar(self):
    """
    Create a toolbar.
    """
 
    self.toolbar = self.CreateToolBar()
    self.toolbar.SetToolBitmapSize((16,16))  # sets icon size
 
    # Use wx.ArtProvider for default icons
    save_ico = wx.ArtProvider.GetBitmap(wx.ART_FILE_SAVE, wx.ART_TOOLBAR, (16,16))
    saveTool = self.toolbar.AddSimpleTool(wx.ID_ANY, save_ico, "Save", "Saves the Current Worksheet")
    self.Bind(wx.EVT_MENU, self.onSave, saveTool)
 
    self.toolbar.AddSeparator()
 
    print_ico = wx.ArtProvider.GetBitmap(wx.ART_PRINT, wx.ART_TOOLBAR, (16,16))
    printTool = self.toolbar.AddSimpleTool(wx.ID_ANY, print_ico, "Print", "Sends Timesheet to Default Printer")
    self.Bind(wx.EVT_MENU, self.onPrint, printTool)
 
    delete_ico = wx.ArtProvider.GetBitmap(wx.ART_DELETE, wx.ART_TOOLBAR, (16,16))
    deleteTool = self.toolbar.AddSimpleTool(wx.ID_ANY, delete_ico, "Delete", "Delete contents of cell")
    self.Bind(wx.EVT_MENU, self.onDelete, deleteTool)
 
    undo_ico = wx.ArtProvider.GetBitmap(wx.ART_UNDO, wx.ART_TOOLBAR, (16,16))
    self.undoTool = self.toolbar.AddSimpleTool(wx.ID_UNDO, undo_ico, "Undo", "")
    self.toolbar.EnableTool(wx.ID_UNDO, False)
    self.Bind(wx.EVT_TOOL, self.onUndo, self.undoTool)
 
    redo_ico = wx.ArtProvider.GetBitmap(wx.ART_REDO, wx.ART_TOOLBAR, (16,16))
    self.redoTool = self.toolbar.AddSimpleTool(wx.ID_REDO, redo_ico, "Redo", "")
    self.toolbar.EnableTool(wx.ID_REDO, False)
    self.Bind(wx.EVT_TOOL, self.onRedo, self.redoTool)
 
    # This basically shows the toolbar 
    self.toolbar.Realize()

Обратите внимание, что я отключил пару кнопок панели инструментов, вызывая EnableTool (wx.id_undo, false). Как видите, этот метод принимает два аргумента: идентификатор кнопки панели инструментов и Bool. Чтобы получить представление о том, как это выглядит, я включил следующий скриншот:

Создание ускорителей

Большинство пользователей силовых пользователей предпочитают использовать сочетания клавиш, а не копаться через запутанные меню. К счастью, WXPYPHON обеспечивает способ сделать только это; Это известно как таблица ускорителя. Эти таблицы обычно связаны с системой меню, однако вам не нужны меню, чтобы использовать таблицу. Я пойду оба подхода, хотя.

Сначала мы поговорим об использовании таблицы с меню. Для начала нам нужно создать экземпляр WX.Acceleratortable. Acceleratortable принимает списки 3-элементов кортежей, состоящих из wx.cel_ctrl, ключа-комбо и идентификатора.

Для этого примера я хочу отобразить Ctrl + Q, чтобы сделать выход приложения. Способ сделать это с Wxpython такой:

accel_tbl = wx.AcceleratorTable([(wx.ACCEL_CTRL, ord('Q'), exitMenuItem.GetId()) ])
self.frame.SetAcceleratorTable(accel_tbl)

Теперь давайте сделаем это без использования пункт меню. Вы заметите, что создаю новый идентификатор и связывайтесь с обработчиком событий перед созданием таблицы. Кроме того, это действительно не так сильно разное.

exitId = wx.NewId()
self.Bind(wx.EVT_MENU, self.onExit, id=exitId )
accel_tbl = wx.AcceleratorTable([(wx.ACCEL_CTRL,  ord('Q'), exitId )])
self.SetAcceleratorTable(accel_tbl) 

Теперь мы рассмотрели основы меню, панели инструментов и создания акселератора. Я надеюсь, что вы нашли это полезно. Отправляйте комментарии/Вопросы в Mike на Pythonlibrary Dot Org.

** Обновление ** Я забыл об этом, но Робин Данн напомнил мне, что вы также можете использовать WXUPDATEUEVET/EVT_UPDATE_UI для обновления меню и панели инструментов и включены или нет или нет.

Дополнительные ресурсы

  1. ZETCode
  2. Видео Showmedo
  3. Мечта в коде
  4. Использование многоключевых ярлыков
  5. Ключевые события

Примечание: Все фотографии в этом посте от окна Windows XP