[Python] Glade3 e statusbar

Gian Mario Tagliaretti g.tagliaretti a gmail.com
Dom 13 Ott 2013 22:20:27 CEST


On Sun, Oct 13, 2013 at 5:53 PM, Marcello <marcello a linuxvil.it> wrote:

> Si effettivamente il problema è proprio il blocco della mainloop.

Lanciando dei processi bloccanti è sempre quello il problema

> Ho provato ad utilizzare Tread, ma ottengo lo stesso risultato

Utilizzare i thread con gtk è una delle cose più difficili (e inutili)
che si possano fare, nonostante decine di post che troverai googlando.

Per risolvere puoi fare 2 cose, usare twisted per lanciare un processo
asincrono o utilizzare IOChannel, qui di seguito un esempio per la
seconda soluzione che ho scritto recentemente, questo aggiorna una
textview ma è facilmente modificabile per le tue esigenze, purtoppo
non hai messo la parte incriminata, se preferisci invece usare twisted
è facilmente traducibile (t.i.r.spawnProcess)

from gi.repository import Gtk, GLib

class MySpawned(Gtk.Window):
    def __init__(self):
        Gtk.Window.__init__(self)

        vb = Gtk.VBox(False, 5)
        self.tw = Gtk.TextView()
        bt = Gtk.Button('Run')
        bt.connect('clicked', self.process)

        vb.pack_start(self.tw, True, True, 0)
        vb.pack_start(bt, False, False, 0)

        self.add(vb)
        self.set_size_request(200, 300)
        self.connect('delete-event', Gtk.main_quit)
        self.show_all()

    def run(self):
        Gtk.main()

    def process(self, widget, data=None):
        params = ['python', '-h']

        def write_to_textview(io, condition):
            if condition is GLib.IO_IN:
               line = io.readline()
               self.tw.props.buffer.insert_at_cursor(line)
               return True
            elif condition is GLib.IO_HUP|GLib.IO_IN:
                GLib.source_remove(self.source_id)
                return False

        self.source_id = None

        pid, stdin, stdout, stderr = GLib.spawn_async(params,

flags=GLib.SpawnFlags.SEARCH_PATH,
                                        standard_output=True)

        io = GLib.IOChannel(stdout)

        self.source_id = io.add_watch(GLib.IO_IN|GLib.IO_HUP,
                                 write_to_textview,
                                 priority=GLib.PRIORITY_HIGH)

if __name__ == '__main__':
    s = MySpawned()
    s.run()

ciao
-- 
Gian Mario Tagliaretti
GNOME Foundation member
gianmt a gnome.org


Maggiori informazioni sulla lista Python