2016-12-12 4 views
0

Я работаю над графическим интерфейсом 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, конечно), и я не кодировал его на протяжении многих лет. Итак, вполне возможно, что я пропущу что-то очевидное.

+0

Только что узнал о 'wx.CallAfter', что мне нужно обернуть операции' TextCtrl' в моем случае. –

ответ

1

Для полноты здесь (одного из) решения (решений).

Оказывается, что манипулирование текстовым управлением с помощью wx.CallAfter в быстрой последовательности не слишком надёжно. GetLastPosition(). Итак, теперь он просто добавляет текст и запоминает, сколько символов нужно удалить , затем раз write(). Затем он удаляет эти символы перед добавлением нового текста.

class RedirectText: 
    def __init__(self, text_ctrl): 
     self.out = text_ctrl 
     self.pending_backspaces = 0 

    def write(self, string): 
     new_string = "" 
     number_of_backspaces = 0 
     for c in string: 
      if c == "\b": 
       number_of_backspaces += 1 
      else: 
       new_string += c 

     if self.pending_backspaces > 0: 
      # current value minus pending backspaces plus new string 
      new_value = self.out.GetValue()[:-1 * self.pending_backspaces] + new_string 
      wx.CallAfter(self.out.SetValue, new_value) 
     else: 
      wx.CallAfter(self.out.AppendText, new_string) 

     self.pending_backspaces = number_of_backspaces 

    def flush(self): 
     None 

 Смежные вопросы

  • Нет связанных вопросов^_^