2015-05-12 2 views
0

Использование Python3 с gi.repository.Gtk, я пытаюсь отобразить несколько текстовых строк внутри GtkTextView через GtkTextBuffer.Python3 gi: дамп ядра ядра GtkTextBuffer

В принципе, я динамически добавлять строки с использованием _addLine метода, который обновляет текстовый буфер таким образом (self._lines является массивом и self._textBuffer является GtkTextBuffer):

def _addLine(self, text): 
    if len(self._lines) == self._maxLines: 
     self._lines = self._lines[1:] 
    self._lines.append(text) 
    content = '\n'.join(self._lines) 
    print("TIC: %d" % len(content)) 
    self._textBuffer.set_text(content) 
    print("TAC") 

К сожалению, при случайных значениях i (либо ниже, либо больше, чем self._maxLines), я случайно получаю дамп ядра между «TIC» и «TAC», поэтому, когда я пытаюсь установить содержимое буфера.

Этот метод вызывается в резьбе, сам вызывается из конструктора (после того, как все элементы графического интерфейса инициализирован):

def _startUpdateThread(self): 
    thread = threading.Thread(target=lambda: self._updateLoop()) 
    thread.daemon = True 
    thread.start() 

def _updateLoop(self): 
    i=0 
    for l in listings.tail(self._logFile, follow=True, n=1000): 
     i+=1 
     print("i=%d, nLines=%d" % (i, len(self._lines))) 
     self._addLine(l) 

Я использую строитель Поляны структурированную, как показано ниже:

GtkWindow 
    - GtkVBox 
     - GtkScrolledWindow 
      - GtkTextView (linked to GtkTextBuffer) 
    - GtkButton (to close the window) 
    - GtkTextBuffer 

Что я сделал не так? В чем причина этого дампа ядра?

Большое спасибо за помощь.

ответ

3

Вы должны использовать GLib.idle_add(), когда вы изменяете виджеты из потока, а не основного цикла GTK.

В этом случае:

GLib.idle_add(self._textBuffer.set_text, content) 
+0

Большое спасибо @ elya5 я должен был установить, что внутри 'updateLoop' вместо' внутри addLine', чтобы сделать его работу. –