Как отключить кнопку «Далее» в Мастере Установки — wxPython #9

автор

Мастер установки – это отличная вещь, когда она работает как следует. Также он может быть очень надоедливым. Многие мастера установки не позволяют нажать на кнопку «Далее» до тех пор, пока вы не закончите настройку или же не заполните все необходимые поля. В данной статье мы рассмотрим, как реализовать подобную блокировку в ваших приложениях.

Как вы отключаете кнопку «Далее» в мастере установки ?

Изначально эта идея появилась у человека, который хотел, чтобы пользователь заполнил обе необходимые строки перед тем, как сможет перейти к следующему диалоговому окну. Это значит, что кнопка «Далее» должна быть отключена до тех пор, пока в обеих строках не появится каких-то данных.

Мне пришла в голову идея использовать wx.Timer, чтобы раз в секунду проверять не появились ли данные в этих строках. Если появились, то таймер запускает хендлер события, который разблокирует кнопку «Далее». Давайте сначала взглянем на панель классов мастера установки. Пример, расположенный ниже, подойдёт для wxPython Classic:

Это довольно стандартный подкласс PyWizardPage. Он просто инициализирует кнопки «Назад» и «Далее» ещё до того, как вы добавили страницы. Давайте продвинемся немного дальше и посмотрим, как можно применить этот класс. Добавьте этот код в тот же файл, в который вы записали предыдущий фрагмент:

Давайте сделаем небольшой перерыв. Первым классом, который мы рассматривали, был MyWizard в котором любое действие не требует условий. MyWizard это подкласс класса Wizard в wxPython. В __init__, мы создаём страницу и появляется кнопка «Далее», так что теперь мы можем её отключить. Затем мы создаём и запускаем объект таймера, привязывая его к методу onUpdate. Наконец-то, мы запускаем мастер установки.

Когда мы создаём страницу мастера установки, мы подтверждаем класс WizardPage. Название этого класса говорит само за себя. Как бы то ни было, мы заканчиваем установкой нескольких виджетов, которые должны быть на странице мастера установки. Из оставшихся битов, интерес представляет лишь метод onUpdate. Он используется для проверки того, ввёл ли пользователь данные в обе строки.

Если он ввёл, мы находим кнопку «Далее», делаем её доступной и останавливаем таймер. Здесь есть потенциальный баг. Что произойдёт, если пользователь возьмёт и сотрёт часть данных уже ПОСЛЕ того, как он заполнил обе строки? Кнопка «Далее» не может самостоятельно отключится. Я предлагаю вам обновлённую версию метода onUpdate, которая решает данную проблему:

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

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

Теперь, когда вы понимаете, как работает код, давайте модифицируем его таким образом, чтобы он работал в последней версии wxPython, которой на данный момент является Phoenix. В Phoenix wx.wizard переместилась в wx.adv. Так что нам нужно изменить код следующим образом.

Вы заметите, что теперь мы импортируем классы Wizard и WizardPage напрямую. PyWizardPage больше не является частью wxPython. Мы переместились из wx.wizard.EVT_WIZARD_PAGE_CHANGED в wx.adv.EVT_WIZARD_PAGE_CHANGED. В остальном, код остался прежним.

Итоги

Отключение кнопки «Далее» в wxPython является не сложным процессом, а лишь слегка запутанным. Было бы неплохо, если бы API виджета Wizard давало немного больше доступа к стандартным виджетам, которые оно создаёт. Как бы то ни было, теперь вы знаете как работать с ними и менять их статус. Используйте эти знания по назначению!

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

Scroll Up