[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