Как обновлять индикатор из потока — wxPython #46

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

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

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

Telegram Чат & Канал

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

Паблик VK

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

После чего диалог уничтожается. Теперь давайте посмотрим, как мы можем выполнить данную задачу, используя wxPython 2.8.12.1, который является довольно популярной версией wxPython, даже несмотря на то, что она уже устарела.

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

Как обновлять индикатор из потока - wxPython #46

Как вы видите, всё что делает этот код – создаёт простую рамку, в которой находится кнопка. Если вы нажмёте на эту кнопку, следующий диалог будет создан и запустится новый поток.

Как обновлять индикатор из потока - wxPython #46

Давайте взглянем на часть кода, которая создаёт диалог:

Этот код просто создаёт диалог с помощью виджета wx.Gauge. Gauge – это виджет, который, по сути, обеспечивает работу индикатора. В любом случае, мы создаём слушателя пабсаб в самом конце метода __init__ нашего диалога. Этот слушатель будет принимать сообщения, которые будут создаваться методом updateProgress. Вы заметите, что все сообщения отправляются в класс потока.

В методе updateProgress мы демонстрируем движение счётчика, обновляя wx.Gauge посредством того, что задаём ему значение.  Также мы проверяем, не является ли это значение равно или больше 20, ведь именно таков размер шага – 20 секунд. Если это действительно так, то диалог уничтожается.

Теперь мы готовы разобраться с кодом потока

Здесь мы создаём поток и немедленно его запускаем. Поток запускает цикл, который длится 20 секунд и использует модуль времени, чтобы засыпать на секунду между каждым повторением. После каждой секунды сна, он направляет сообщение в диалог. Это сообщение приказывает обновить индикатор.

Обновляем код для того, чтобы он работал в wxPython 3.0.2.0 + Phoenix

Код в прошлом примере был написан с использованием старого API пабсаба, а им перестали пользовался в ту же секунду, когда большинство перешло на wxPython 2.9. Так что, если вы запустите тот код в версии 2.9 или новее, то, скорее всего, нарвётесь на неприятности. Таким образом, для полноты картины, вот версия кода, которая использует новый API пабсаба и работает на wxPython Phoenix:

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

Итоги

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

Если вы это сделаете, вам нужно будет проверят размер файла, и, если он превышает установленный вами шаг, загружать его по фрагментам, используя всё тот же wx.Gauge. Таким образом, индикатор будет обновляться после загрузки каждого фрагмента. Надеюсь, что у вас также появились идеи использования данного виджета в ваших проектах.