Я работаю над графическим интерфейсом wxPython для esptool.py, то есть приложение будет вызывать этот скрипт. Для начала я хотел бы перенаправить содержимое, которое esptool.py выводит на консоль в TextCtrl. Я следил за frequently referenced article за это, и он работает хорошо.Как постоянно обновлять (терминальный) wxPython TextCtrl
Однако в настоящее время я застрял в работе с progress monitor that esptool.py prints to console. Он печатает что-то вроде «25%», за которым следует число \b
, которое сразу же стирает напечатанное, а затем «26%», которое сразу же стирается и т. Д.
Планирование состояло в том, чтобы разобрать строку TextCtrl.AppendText()
все, кроме символов обратного пробела, а затем TextCtrl.Remove()
столько символов, сколько есть символы обратного пространства.
Приведенный ниже код отлично работает, когда я перехожу к нему с помощью отладчика, но он сильно сработает, когда «отпустите». Кажется, что есть проблема с временными/потоковыми процессами. По-видимому, я не могу позвонить TextCtrl.Remove()
сразу после TextCtrl.AppendText()
?
class RedirectText:
def __init__(self, textCtrl):
self.out = textCtrl
def write(self, string):
new_string = ""
number_of_backspaces = 0
# this could definitely be improved performance wise...
for c in string:
if c == "\b":
number_of_backspaces += 1
else:
new_string += c
self.out.AppendText(new_string)
if number_of_backspaces > 0:
last_position = self.out.GetLastPosition()
self.out.Remove(last_position - number_of_backspaces, last_position)
def flush(self):
None
Код, который вызывает esptool.py, запускается в своем потоке, чтобы не прорезать основной поток пользовательского интерфейса.
Это мой первый реальный проект Python (и, следовательно, первый w/wxPython, конечно), и я не кодировал его на протяжении многих лет. Итак, вполне возможно, что я пропущу что-то очевидное.
Только что узнал о 'wx.CallAfter', что мне нужно обернуть операции' TextCtrl' в моем случае. –