Убеждаемся в том, что в каждой рамке по одной инстанции — wxPython #42

В один прекрасный день я наткнулся на обсуждение на StackOverflow, в рамках которого парень пытался выяснить как открывать саб-фрейм лишь единожды. Проще говоря, он хотел, чтобы это происходило с одной инстанцией саб-фрейма (и другими саб-фреймами). После короткого поиска в Google, я нашёл старую тему в Google-группе wxPython, содержащую интересное решение для данной задачи.

На самом деле нужно немного мета-программирования, но упражнение довольно интересное, так что я решил поделится им с читателями моего сайта. Вот код:

Изюминкой данного кода является класс SingleInstanceFrame и его метод __new__ в частности. Здесь мы можем проверить была ли переменная self.instance задана как None. Если да, мы создаём новую инстанцию.

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

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

Telegram Чат & Канал

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

Паблик VK

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

Мы также создаём новую инстанцию в случае, если пользователь закрывает рамку. Для этого и нужно утверждение elif. Оно используется для проверки того, была ли инстанция удалена, и, если она была удалена, создаёт новую инстанцию.

Вы также заметите, что у нас есть переменная, которая называется self.init. Она нужна для проверки того, была ли инстанция инициализирована. Если была, __init__ просто вернёт, вместо того, чтобы повторно инстанцинировать всё. В любом случае, я надеюсь, что данный пример был для вас поучительным.

Итоги

Эта статья демонстрирует шаблон проектирования, который принято называть одиночка. Он достаточно эффективен для решения поставленных задач. Если вы хотите, чтобы после нажатия кнопки открывалась лишь одна рамка, использование «одиночки» отлично подойдёт.