Hi,
a quite frequent situation when writing pygtk apps is that of having to
show the output generated by a shell command inside a textview.
As that is a recurrent question I've been trying to write a simple example
so it could be put in the FAQ. The problem seems to be avoiding blocking
in the external process, so the example in FAQ 23.20, with a coroutine
approach calling gtk.main_iteration() doesn't work.
Most people seem to be using threads to do the job, but apparently it is
also possible to use pipes in *nix systems in non-blocking mode.
So far I could only get working a threaded example and my question is...
can you think of a portable solution (*nix, Win32 at least...) that can be
used as easily as the threaded one but without using threads?.
Could be fine using a threaded solution here?.
Are you fine with an example like this going into the FAQ? Any comments to
improve the example so it can go to the FAQ?
--- Example
#!/usr/bin/env python
import os, threading, locale
import pygtk
pygtk.require('2.0')
import gtk
import gobject
encoding = locale.getlocale()[1]
utf8conv = lambda x : unicode(x, encoding).encode('utf8')
sw = gtk.ScrolledWindow()
sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
textview = gtk.TextView()
textbuffer = textview.get_buffer()
sw.add(textview)
def on_button_clicked(button, buffer):
command = 'dir -R %s' % os.getcwd()
thr = threading.Thread(target= read_output, args=(command, buffer))
thr.run()
def read_output(oscommand, txtbuffer):
stdin, stdouterr = os.popen4(oscommand)
for line in stdouterr.readlines():
txtbuffer.insert(txtbuffer.get_end_iter(), utf8conv(line))
win = gtk.Window()
win.resize(300,500)
win.connect('delete-event', gtk.main_quit)
button = gtk.Button(u"Press me!")
button.connect("clicked", on_button_clicked, textbuffer)
vbox = gtk.VBox()
vbox.pack_start(button, gtk.FALSE)
vbox.pack_start(sw)
win.add(vbox)
win.show_all()
gtk.main()
--
Take care,
Pachi
_______________________________________________
pygtk mailing list [email protected]
http://www.daa.com.au/mailman/listinfo/pygtk
Read the PyGTK FAQ: http://www.async.com.br/faq/pygtk/