4

私は , のGtk.ScrolledWindow()中に withを持っていますGtk.TextView()(私は PyGObject イントロスペクションを使用しています)。

テキストを挿入して別のスレッドから自動スクロールし、メソッドappend_textを続けて数回呼び出すと、いくつかの警告が表示され、GUI がクラッシュします。

これは私のコードの厄介な部分です:

class TextViewWindow(Gtk.Window):

    [...]

    def append_text(self, text):
        self.textbuffer.insert(self.textbuffer.get_end_iter(), text)
        self.scroll_to_end()

    def scroll_to_end(self):
        self.textbuffer.place_cursor(self.textbuffer.get_end_iter())
        insert_mark = self.textbuffer.get_insert()
        self.textview.scroll_to_mark(insert_mark , 0.0, True, 0.0, 1.0)

私が間違っていることを誰かが知っていますか?

--
ここに私が得たエラーのいくつかがあります:

Gtk-WARNING **: 無効なテキスト バッファ反復子: 反復子が初期化されていないか、反復子が作成されてからバッファ内の文字/pixbufs/ウィジェットが変更されています。バッファーを変更しても位置を保持するには、マーク、文字番号、または行番号を使用する必要があります。イテレータを無効にすることなく、タグを適用してマークを挿入できますが、「インデックス可能な」バッファ コンテンツ (文字オフセットによって参照できるコンテンツ) に影響を与えるミューテーションは、すべての未処理のイテレータを無効にします。

Pango-CRITICAL **: pango_layout_index_to_pos: アサーション `layout != NULL' が失敗しました

Gtk-WARNING **: gtktextview.c:4813: 何らかのテキスト行が変更されたか、画面上の行の最後の検証以降にスクロールが発生しました - テキスト ウィジェットのバグである可能性があります。

Gtk:ERROR:gtktextview.c:4814:gtk_text_view_paint: コードに到達しないでください

4

2 に答える 2

3

他のスレッドから Gtk ウィジェットを更新するには、次のことを行う必要があります。

を。呼び出す前に次のメソッドを呼び出しますGtk.main()

GObject.threads_init()
Gdk.threads_init()

b. スレッドで、Gtk ウィジェットを更新するコードを次のように囲みます。

Gdk.threads_enter()
# your code here
Gdk.threads_leave()

あなたの場合、おそらく次のようなものが必要になるでしょう:

Gdk.threads_enter()
your_window.append_text('something')
your_window.scroll_to_end()
Gdk.threads_leave()
于 2012-01-10T15:46:20.173 に答える
1

コメントからわかるように、スレッドを使用している場合、私の経験によれば、スレッド内のウィジェットを更新しようとしてもうまくいきません。

この問題の回避策は、ウィジェットを更新するすべてのアクションをスケジュールしGLib.idle_addて、更新がメインスレッドで行われるようにすることです。

于 2012-01-10T13:27:19.947 に答える