On Sun, Oct 13, 2013 at 5:53 PM, Marcello <marce...@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 gia...@gnome.org _______________________________________________ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python