Python 使用线程挂起的GNOME小程序

Python 使用线程挂起的GNOME小程序,python,multithreading,gtk,pygtk,gnome,Python,Multithreading,Gtk,Pygtk,Gnome,我正在尝试使用python(pyGTK)开发一个GNOME小程序(放入面板)。我从以下步骤开始 我的计划是让applet在后台以重复的方式做一些事情(使其显示得到更新)。所以我想我需要线来做。我已经看过一些关于如何在pyGTK中使用线程的教程,其中大多数都遵循以下步骤。他们都建议要谨慎 我尝试了不同的版本,包括 #!/usr/bin/python import pygtk import sys pygtk.require('2.0') import gtk import gobject gob

我正在尝试使用python(pyGTK)开发一个GNOME小程序(放入面板)。我从以下步骤开始

我的计划是让applet在后台以重复的方式做一些事情(使其显示得到更新)。所以我想我需要线来做。我已经看过一些关于如何在pyGTK中使用线程的教程,其中大多数都遵循以下步骤。他们都建议要谨慎

我尝试了不同的版本,包括

#!/usr/bin/python

import pygtk
import sys
pygtk.require('2.0')
import gtk
import gobject
gobject.threads_init()

import gnomeapplet
import time
from threading import Thread

def threadFunction(label):
    gobject.idle_add(label.set_text, 'In the thread')

def factory(applet, iid):
        text = gtk.Label('Start %s' % iid)
        applet.add(text)
        applet.show_all()
        Thread(target=threadFunction, args=(text)).start()
        return True

if __name__ == '__main__':
        print "Starting factory"
        gnomeapplet.bonobo_factory("OAFIID:Gnome_Panel_Example_Factory", gnomeapplet.Applet.__gtype__, "Simple gnome applet example", "1.0", factory)
但它不起作用。尝试更新演示文稿时线程执行似乎挂起(
gobject.idle\u add
)。我试过:

  • gobject.threads_init()
    替换为
    gtk.gdk.threads_init()
    ——因为这是一些教程使用的
  • 子类化threading.Thread类,而不是使用
    Thread(target=)
  • 使用
    gtk.threads\u输入
    gtk.threads\u离开
    在单独线程中运行的任何代码并更新小部件
那么我的错误是什么?


线程是否与小程序不兼容(与其他pyGTK程序不同)?

根据gtk列表上的几条评论,您不应该尝试从线程更新用户界面。最好从主应用程序轮询子线程。有关参考资料,请参阅和。通过搜索档案可以找到更多信息。我不知道这方面的任何官方文档。

回答这个问题可能已经太晚了,但无论如何,希望这能帮助任何一位浏览过这一页的人


但是不是
gobject.idle\u add
应该从主线程中调用更新吗?至少这就是它被发明的目的?不管怎样,谢谢你的回答。如果你从另一个线程调用它,我认为它不会从主线程内部完成。idle_add的目的是允许gobject在没有更高优先级的事情要做时调用该函数。在这一点上,我冒险进入投机然而。我的建议仍然是从主线程轮询您的工作线程,并从主线程调用idle_add。顺便说一句,包括gtk标记可能会使您的问题更容易被了解gtk内部的人看到。关于idle_add:这是pyGTK FAQ声称的():“信号回调将在主线程中执行。”关于“gtk”标签:添加了这个。谢谢