2016-06-13 14 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テキストメッセージのキューです。

アプリケーションは、しばらくの間、動作しますが、その後、必ず、私はライン0に挿入しています、次のエラー

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

ノートでクラッシュし、そのイテレータが挿入呼び出しによって破壊されたという事実は全く影響を与えないはず。

失敗する前に20行から200行の間に書き込みます。テキストバッファの端を書き去ることには関係しておらず、スクロールバーは期待どおりに表示されます。

提案がありますか?

+0

RBTありがとうございますが、さらに詳しい情報が必要です。私はGTKから別のスレッドで実行される以下のメソッドを持っています。 –

答えて

3

GtkTextBufferまたはGTK +の一部は、別のスレッドからアクセスすることはできません。 GUIスレッドからアクセスする必要があります。 GUIスレッドでバッファ更新をキューに入れるには、GLib.idle_add()を使用する必要があります。

関連する問題