Создаём простой блокнот — wxPython #41

Виджет wx.Notebook позволяет нам создавать пользовательский интерфейс с несколькими вкладками. Большинство примеров, которые вы могли бы найти в сети выглядят достаточно сложно, а новичкам стоило бы начинать с чего-то невероятно простого.

Давайте начнём с примера, который будет легко повторить, а затем немного видоизменим его так, чтобы в будущем было легко добавить какие-либо усовершенствования.

Простой блокнот

Наш простой виджет блокнота состоит из двух вкладок, имеющих псевдослучайный цвет фона. Взгляните:

Создаём простой блокнот - wxPython #41

 

Этот код достаточно короткий и удобный. Давайте остановимся на минуту и рассмотрим данный пример.

В классе DemoFrame, у нас есть главная панель, которая содержит всего лишь один дочерний виджет Frame. Внутри него у нас расположен контроль блокнота. Каждая страница ноутбука является инстанцией класса TabPanel, и она должна иметь «случайный» цвет фона и одну кнопку без каких-либо конкретных функций.

Есть вопросы по Python?

На нашем форуме вы можете задать любой вопрос и получить ответ от всего нашего сообщества!

Telegram Чат & Канал

Вступите в наш дружный чат по Python и начните общение с единомышленниками! Станьте частью большого сообщества!

Паблик VK

Одно из самых больших сообществ по Python в социальной сети ВК. Видео уроки и книги для вас!

Мы добавляем Блокнот в сайзер и устанавливаем пропорцию расширения равную единице. Это значит, что он будет полностью заполнять панель, в независимости от размера самой рамки. Если честно, на этом всё.

Другой интересной темой являет то, что событиям Блокнота, таким как EVT_NOTEBOOK_PAGE_CHANGED, может понадобится вызов “event.Skip()” в их ивент-хендлере, чтобы они продолжали работать как следует.

Иерархия ивентов в wxPython достаточно сложна для освоения, так что я предлагаю представить, что это просто пузыри в пруду. Если вы привязываете виджет к определённому ивенту и не вызываете event.Skip(), значит ваш ивент обрабатывается ИСКЛЮЧИТЕЛЬНО в том определённом хендлере.

Как будто один пузырёк отплыл от других на дне пруда. Однако, иногда вам бывает нужно, чтобы ивент был обработан выше в иерархии, к примеру, в родительском виджете. В таком случае, вызовите Skip() и «пузырёк» вашего события поднимется в следующий хендлер. wxPython wiki и книга Робина Дана «wxPython в действии» помогут вам разобраться в этом лучше.

Эти данные актуальны лишь для простого примера Блокнота. Давайте потратим немного времени на то, чтобы немного его изменить.

Блокнот после рефакторинга

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

Также нам нужно сохранять возможность легко расширить и видоизменить код, если в него нужно будет добавить новые возможности.

Наиболее простой способ рефакторинга кода – это его модулирование. Чтобы сделать это, нужно превратить крупные виджеты в подклассы. Давайте взглянем:

Здесь мы берём wx.Panel, которая у нас уже была и помещаем её в свой собственный подкласс, который называется DemoPanel. Мы проделываем ту же операцию с нашим виджетом wx.Notebook, который мы поместили в класс DemoNotebook.

Обратите внимание на то, что, проделывая подобную операцию мы можем изменить наши ссылки с названий инстанций на простое self. Ввиду этих изменений класс DemoFrame значительно потеряет в размерах.

Итоги

Учтите, что всё теперь в разных классах, мы можем перемещать разные классы в отдельный модули и улучшать их, если будет такая необходимость. Благодаря этому код будет проще распространять между проектами и потребность в хранении всех элементов в едином модуле полностью отпадает.

Вы можете пойти дальше и поместить некоторые из созданных нами классов в отдельные модули, которые, в последствии, можно будет импортировать. Вы сразу поймёте насколько этот концепт прост в использовании и полезен.