Используем стили wx.Frame — wxPython #28

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

  • Разные способы создания стандартной рамки
  • Как создать рамку без надписи (то есть без строки заголовка)
  • Как создать рамку с отключённой кнопкой закрытия
  • Как создать рамку без кнопок «Свернуть» и «Развернуть»
  • Как создать рамку, размер которой нельзя изменить
  • Как создать рамку без системного меню
  • Как сделать так, чтобы ваша рамка отображалась поверх остальных окон

Приступая к работе

Используем стили wx.Frame - wxPython #28

Начать с истоков, то есть изучить поведение стандартной рамки, чтобы понять какие изменения возможны. Так что давайте начнём со стандартного стиля рамки wx.DEFAULT_FRAME_STYLE. Вы можете создать рамку, которая использует wx.DEFAULT_FRAME_STYLE (или его эквивалент) тремя разными способами. Первый и самый простой – сделать что-то вроде этого:

Мы создадим стандартную рамку, обладающую функциональностью, привычной каждому пользователю. Теперь же давайте значительно изменим её, используя wx.DEFAULT_FRAME_STYLE.

Данный код делает АБСОЛЮТНО то же самое, что и предыдущий. Теперь, если вы немного покопаетесь в коде, вы выясните, что wx.DEFAULT_FRAME_STYLE по сути выглядит именно так, то есть является комбинацией данных элементов:

Так что давайте ещё раз изменим код, чтобы понять, как это работает.

Это было просто. Теперь вы готовы экспериментировать!

Создаём рамку без надписи

Используем стили wx.Frame - wxPython #28

Давайте создадим рамку, которая не имеет подписи. Подпись – это то, что содержит название приложения, кнопки сворачивания, разворачивания или закрытия, и располагает в верхней части окна.

Когда это код будет запущен, панель сожмётся в верхнем левом углу рамки. Вы можете изменить код так, чтобы панель располагалась в другом месте, но это будет выглядеть ужасно странно. Вам также стоит помнить, что это приложение нельзя закрыть, так как самой кнопки «Закрыть» попросту нет. Так что вам нужно будет снять процесс Python, чтобы закрыть данное приложение.

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

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

Telegram Чат & Канал

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

Паблик VK

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

Создаём рамку с отключённой кнопкой «Закрыть»

Используем стили wx.Frame - wxPython #28

Некоторым программистам бывает нужна рамка с отключённой кнопкой «Закрыть». На Windows, вы не можете удалить эту кнопку, но при этом оставить все остальные, но вы можете её деактивировать. Нa Linux эта кнопка действительно удаляется. Вот сам код:

Конечно, на Windows, у вас просто не останется других способов закрыть приложение, так что данный момент будет раздражать пользователей. Может, место стандартного крестика, вы захотите добавить wx.Button, которая выполнит его роль. В Linux, вы сможете выйти из приложения посредством двойного клика в верхнем левом углу.

Создаём рамку без кнопок «Свернуть» и «Развернуть»

Используем стили wx.Frame - wxPython #28

Иногда, вам нужно создать приложение, которое нельзя будет свернуть или развернуть. Раз уж мы зашли так далеко, то давайте создадим приложение, которое не будет отображаться в панели задач!

Как вы видите, мы просто удалили флажки стиля wx.MINIMIZE_BOX и wx.MAXIMIZE_BOX, а также добавили флажок стиля wx.FRAME_NO_TASKBAR. На Windows 7 это работает отлично, но на Linux и Mac OS я заметил, что кнопка «Развернуть» не была удалена.

Создаём рамку, размер которой нельзя изменить

Используем стили wx.Frame - wxPython #28

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

Учтите, что здесь мы используем битвайс операторов, чтобы удалить 3 флажка стилей из wx.DEFAULT_FRAME_STYLE. И, как вы видите, у нас получается рамка, размер которой изменить попросту невозможно.

Создаём рамку без системного меню

Используем стили wx.Frame - wxPython #28

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

Вы заметите, что всё, что мы сделали – это уменьшили количество флажков стиля до одного — wx.CAPTION.

Создаём рамку, которая отображается поверх остальных окон

Используем стили wx.Frame - wxPython #28

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

Здесь мы использовали стандартный флажок стиля и добавили (использовали аддон) wx.STAY_ON_TOP.

Примечание: данный пример не работает на Mac OS X El Capitan.

Итоги

Что ж, теперь вы знаете как редактировать почти все стили рамок. Есть ещё несколько других флажков стиля, которые доступны лишь на определённой ОС (вроде wx.ICONIZE) или же просто менее полезны. Для того, чтобы узнать больше о тех флажках, я советую почитать документацию. А пока, продолжайте двигаться вперёд и используйте свои знания по назначению.