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

автор

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

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

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

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

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

Итоги

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

Вам может быть интересно

Scroll Up