2016-06-13 103 views
0

我有一個應用程序使用GtkTextView和GtkTextBuffer。行被添加到緩衝用它運行在從主處理一個單獨的線程以下Python代碼:Gtk +3 TextView應用程序崩潰

while True:  
     if aLogQueue.qsize() > 0: 
      aBuffer = aLogTextView.get_buffer() 
      try: 
       newLogMessage = aLogQueue.get_nowait() 
       ipri = int(newLogMessage[0])      
       if(ipri>=self.ListenLogMinPr): 
        aniter = aBuffer.get_iter_at_line(0) 
        aBuffer.insert(aniter, newLogMessage) 
        #mark = aBuffer.get_mark('insert') 
        #aniter = aBuffer.get_iter_at_mark(mark) 
        #aBuffer.place_cursor(aniter) 
       pass 
      except: 
       print('threw exception in message loop') 
       self.gui_shutdown() 

aLogQueue是一個行ASCII文本消息的隊列。

應用程序工作了一段時間,但後來總是有以下錯誤

Gtk:ERROR:gtktextview.c:4328:gtk_text_view_validate_onscreen: assertion failed: (priv->onscreen_validated)

請注意,我在0線插入崩潰,使迭代器被插入調用而被破壞的事實應該沒有影響。

它在失敗之前寫入20到200行。它看起來並沒有涉及到註銷文本緩衝區的邊緣,並在預期時出現滾動條。

有什麼建議嗎?

+0

謝謝RBT,但我需要更多的信息。我有以下方法在GTK的獨立線程中運行。 –

回答

3

您不能從單獨的線程訪問GtkTextBuffer或GTK +的任何部分。您必須從GUI線程訪問它。您將需要使用GLib.idle_add()在GUI線程上排隊緩衝區更新。