Как создать диалоговое окно для логина — wxPython #14

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

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

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

Telegram Чат & Канал

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

Паблик VK

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

Проще говоря, нам нужно создать диалоговое окно, куда пользователь должен ввести свои логин и пароль. Если они введены верно, то программа продолжит загрузку и выведет его в главное меню или другую часть интерфейса. Здесь работает тот же принцип, что и на большинстве веб-сайтов, особенно сервисов электронной почты. Приложения для рабочего стола обычно не располагают подобной функцией, однако вы сможете встретить её в приложениях от Stamps.com и некоторых силовых структур. В данной статье, мы создадим диалоговое окно, которое будет выглядеть вот так:

Как создать диалоговое окно для логина - wxPython #14

Используя Pubsub

Первое решение предполагает использования встроенной в wxPython версии Pubsub. Давайте взглянем на пример:

Большая часть этого кода функционирует благодаря подклассу wx.Dialog, который мы называем LoginDialog. Вы заметите, что мы настроили виджет контроля текста пароля, так, чтобы он использовал стиль wx.TE_PASSWORD, который будет скрывать (превращать в жирные точки) все вводимые в строку пароля символы. Всё самое интересное происходит в хендлере событий. Здесь мы определяем шуточный пароль, который мы используем для сравнения с тем, который вводит пользователь.

В реальности вам скорее всего придётся взять хэш введённых паролей, которые вводятся, чтобы сравнивать их с теми, что уже есть в реальной базе данных зарегистрированных пользователей. Или же вы можете отправлять введённые пользователем данные на сервер аутентификации, чтобы там они сравнивались и делался вывод об их подлинности. С целью демонстрации мы выбираем более простой вариант и просто проверяем сам пароль. Вы заметите, что данные вводимые в строку «Имя пользователя» полностью игнорируются. Да, согласен, это не реалистично, но всё же это лишь пример.

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

Используя переменную инстанции

Существуют и другие способы сообщить главному фрейму о продолжении загрузки, такие как использование флажков в классе диалога, которые пользователь сможет выбрать. Мы сталкивались с таким методом при завершении установки wxPython. Вот имплементация, которая демонстрирует этот метод (метод latter), используя переменную в качестве флажка:

В данном примере мы добавили флаг в подкласс диалога, который мы назвали elf.logged_in. Если пользователь вводит правильный пароль, мы приказываем диалогу закрыться. Это заставляет wxPython вернуть контроль обратно к классу MainFrame, где мы проверяем переменную, чтобы понять залогинился пользователь или же нет. Если нет – приложение закроется. В обратном случае, оно начнёт загрузку.

Итоги

Есть несколько улучшений, которые мы могли бы добавить, например, настройка фокуса на строке «Имя пользователя» или же добавление кнопки «Отмена». Я уверен, что вы можете сделать это самостоятельно. В целом, эта статья должна была вас раззадорить и подтолкнуть к новым свершениям!