2

我正在尝试使用 python (pyGTK) 开发一个 GNOME 小程序(放入面板)。我已经按照其他 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) 时,线程执行似乎挂起。我试过了:

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

那我的错误是什么?

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

4

2 回答 2

2

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

于 2010-01-13T02:56:23.550 回答
0

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

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

于 2013-11-19T19:14:21.627 回答