L'aggiornamento dell'etichetta di appindicatori non funziona dal thread python

2

Sono nuovo nella programmazione di Python e GUI. Stavo cercando di imparare entrambi facendo una piccola applicazione. Nella mia applicazione, un processo in background dovrebbe essere eseguito sempre e mostrare la quota fittizia dell'utente tramite l'appindicatore. Ecco il mio codice:

#!/usr/bin/env python

import pyjsonrpc
from gi.repository import Gtk
from gi.repository import AppIndicator3 as appindicator
import thread
import glib

ind = None

def start_gtk_main():
    ind = appindicator.Indicator.new(
                                  "example-simple-client",
                                  "indicator-messages",
                                  appindicator.IndicatorCategory.APPLICATION_STATUS)

    ind.set_status (appindicator.IndicatorStatus.ACTIVE)
    ind.set_label('NA', '')

    menu = Gtk.Menu()
    menu_quit = Gtk.MenuItem("Quit")
    menu_quit.connect("activate", quit_app)
    menu.append(menu_quit)
    menu_quit.show()

    ind.set_menu(menu)

    try:
        thread.start_new_thread(update_ind_label, ())
    except:
        print "Error: unable to start thread"

    Gtk.main()

def quit_app(self):
    Gtk.main_quit()

def update_ind_label():
    value = glib.timeout_add_seconds(5, handler_timeout)

def handler_timeout():
    url = "http://localhost/jsonrpc-server/"
    http_client = pyjsonrpc.HttpClient(url)
    response = http_client.call("getQuota", 2)
    quota = response.get('quota')
    ind.set_label(quota+'%', '')
    return True

if ind is None:
    start_gtk_main()

Il problema è che quando timeout_add_seconds di glib attiva la funzione di callback handler_timeout, mi dà errore di segmentazione.

Ho anche provato senza thread come:

# ....other code....
glib.timeout_add_seconds(5, handler_timeout)
Gtk.main()
# ....other code....

Ma mi dà lo stesso errore.

Ho visto molte domande simili su Internet, la maggior parte di loro ha suggerito di utilizzare la funzione di timeout di GLib o di GObject, ma nessuna ha funzionato nel mio caso. Qualcuno può dirmi cosa sto facendo male qui?

FYI, il mio sistema operativo è Xubuntu 13.10.

    
posta sparrow 02.05.2014 - 19:33

1 risposta

5

Sostituire:

import glib

con:

from gi.repository import GLib as glib

E il codice dovrebbe funzionare così com'è, anche se hai bisogno di un global ind all'inizio di start_gtk_main() , altrimenti ind viene creato locale alla funzione e ottieni un'eccezione in handler_timeout() che ind è None .

    
risposta data Jason Conti 02.05.2014 - 23:48

Leggi altre domande sui tag