Апплет GNOME с использованием потоков зависает - PullRequest
2 голосов
/ 13 января 2010

Я пытаюсь разработать апплет GNOME (помещенный в панель), используя python (pyGTK). Я начал с того, что следовал учебнику , предложенному в другом вопросе SO .

Мой план состоит в том, чтобы позволить апплету делать что-то в фоновом режиме повторяющимся образом (вызывая обновление его отображения). Поэтому я подумал, что мне понадобятся темы, чтобы сделать это. Я видел несколько руководств по использованию потоков с 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() - потому что это то, что используют некоторые учебники,
  • Подклассирование потоков. Класс вместо использования Thread(target=)
  • используя gtk.threads_enter и gtk.threads_leave вокруг любого кода, который запускается в отдельном потоке и обновляет виджеты,

В чем тогда моя ошибка?

Является ли многопоточность несовместимой с апплетами (в отличие от других программ pyGTK)?

Ответы [ 2 ]

2 голосов
/ 13 января 2010

Согласно нескольким комментариям в списках gtk, вы не должны пытаться обновить свой пользовательский интерфейс из потоков. Было бы лучше опросить дочерние темы из вашего основного приложения. Для ссылок см. здесь и здесь . Больше можно найти в поиске в архивах. Я не знаю никакой официальной документации об этом.

0 голосов
/ 19 ноября 2013

Возможно, уже слишком поздно отвечать, но в любом случае надеюсь, что это поможет кому-нибудь перейти на эту страницу.

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

...