【问题标题】:GNOME applet using threads hangs使用线程的 GNOME 小程序挂起
【发布时间】:2010-01-12 23:27:29
【问题描述】:

我正在尝试使用 python (pyGTK) 开发一个 GNOME 小程序(放入面板)。我从关注tutorial suggested in other SO question 开始。

我的计划是让小程序以重复的方式在后台执行某些操作(导致其显示被更新)。所以我想我需要线程来做到这一点。我看过几个关于如何在 pyGTK 中使用线程的教程——其中大多数都遵循pyGTK FAQ。他们都建议保持谨慎。

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

#!/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_add)。我试过了:

  • gtk.gdk.threads_init() 替换gobject.threads_init() - 因为这是一些教程使用的,
  • 子类化threading.Thread类而不是使用Thread(target=)
  • 使用gtk.threads_entergtk.threads_leave 围绕在单独线程中运行并更新小部件的任何代码,

那我的错误是什么?

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

【问题讨论】:

    标签: python multithreading gtk pygtk gnome


    【解决方案1】:

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

    【讨论】:

    • 但是gobject.idle_add 不应该从主线程中调用更新吗?至少这似乎是它的发明目的?无论如何感谢您的回答。
    • 如果您从另一个线程调用它,我认为它不会在主线程中执行此操作。 idle_add 的目的是允许 gobject 在没有更高优先级的事情要做时调用该函数。然而,在这一点上,我正在冒险进行猜测。我的建议仍然是从主线程轮询您的工作线程并从主线程调用 idle_add。
    • 顺便说一句,包括 gtk 标签可能会使您的问题更容易被更了解 gtk 内部结构的人看到。
    • 关于 idle_add:这就是 pyGTK FAQ 声称的 (faq.pygtk.org/index.py?req=show&file=faq20.001.htp):“信号回调将在主线程中执行。”
    • 关于“gtk”标签:添加了这个。谢谢!
    【解决方案2】:

    回答可能为时已晚,但无论如何希望这可以帮助任何人跳转到此页面。

    http://faq.pygtk.org/index.py?file=faq20.006.htp&req=show

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-05
      • 2014-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-13
      • 2019-06-02
      相关资源
      最近更新 更多