1

GtkTextView と GtkTextBuffer を使用するアプリケーションがあります。メイン プロセスとは別のスレッドで実行される次の Python コードを使用して、行がバッファーに追加されます。

    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 は、1 行の ASCII テキスト メッセージのキューです。

アプリケーションはしばらく動作しますが、次のエラーで必ずクラッシュします

Gtk:ERROR:gtktextview.c:4328:gtk_text_view_validate_onscreen: アサーションに失敗しました: (priv->onscreen_validated)

0 行目に挿入しているので、イテレータが挿入呼び出しによって破棄されても効果がないことに注意してください。

失敗する前に 20 ~ 200 行を書き込みます。これは、テキスト バッファの端から書き出すこととは関係がないようで、予期したときにスクロール バーが表示されます。

助言がありますか?

4

2 に答える 2

5

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

于 2016-06-13T02:30:53.900 に答える