Как сделать окно вывода логов в wx.TextCtrl — wxPython #55

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

Список всех урок: Полный курс уроков по wxPython

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

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

Telegram Чат & Канал

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

Паблик VK

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

Методом изучения документации, я наткнулся на интересный метод wx.TextCtrl.AppendText(msg), который добавляет в окно принятую строку msg к уже имеющимся.

Возьмем frame из статьи выше и избавимся от класса CustomConsoleHandler и и что с ним связано.

Добавим метод, который будет выводить в наше окно логов какой-то текст по нажатию кнопки и не забываем, что после message стоит добавить \n для переноса новой строки логов и итого получаем:

Как сделать окно вывода логов в wx.TextCtrl - wxPython #55

Инвертировать лог, можно добавив чекбокс wx.CheckBox и создав список, в котором можно хранить все сообщения. Однако есть нюансы, перед каждым вызовом метода, необходимо очищать TextCtrl иначе, сообщения будут дублироваться и спамить. а также после цикла нужно переместить курсор вверх на последнее сообщение инвертированного лога, тут поможет wx.TextCtrl.SetInsertionPoint(0) который помещает курсор TextCtrl в нужное положение.

Для инверсии проверяем флажок при помощи метода IsChecked и если он True, то делаем reversed нашего списка с сообщениями, таким образом вывод будет инвертирован.

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

НЮАНС

Если логи будут приходить не из потока, а из процесса который крутится на бэкенде или в самом ui, то сама программа может зависнуть и ждать ответа. Этот метод подойдет для логирования внутренних методов самого ui или логи вынесенные в отдельный поток.

ИТОГ

Для вывода небольшого кол-ва логов, можно использовать AppendText, иначе стоит подумать насчет хендлера, так как вышеописанный способ не самый оптимальный. Вывод в окне можно окрасить в любой цвет, можно использовать как цвета от самого wx (wx.RED, wx.GREEN и т.д.) но и множества RGB (255, 0, 0) — красный, (0, 100, 0) — зеленый.

Благодарности

Данная статья была написана нашим уважаемым читателем Павел Вирекс. Спасибо активным читателям которые делятся своими знаниями со всеми.