使用PyGtk时未从其他线程更新GUI

发布于 2021-01-29 16:35:25

我正在使用PyGTK来构建GUI应用程序。我想从另一个线程更新textview窗口小部件,但是每次我尝试更新时该窗口小部件都没有更新。我应该怎么做才能获得可靠的GUI更新?

关注者
0
被浏览
45
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    GTK
    +不是线程安全的,因此您不应简单地从其他线程调用GUI更新方法。glib.idle_add(或在较旧的PyGTK版本中为gobject.idle_add)可用于此目的。

    而不是写:

    label.set_text("foo")
    

    你会写:

    glib.idle_add(label.set_text, "foo")
    

    这导致函数调用在GTK +中排队。

    如果您需要运行多个语句,通常将它们包装到一个函数中会更容易:

    def idle():
        label1.set_text("foo")
        label2.set_text("bar")
    glib.idle_add(idle)
    

    确保传递给的函数idle_add不返回True;否则它将再次排队。

    编辑: 正如Daniel指出的,您需要gtk.gdk.threads_init()首先在程序中的任何地方调用。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看