[prev in list] [next in list] [prev in thread] [next in thread] 

List:       gtk
Subject:    Re: Call external programs and keep showing its outputs
From:       onetmt <onetmt () gmail ! com>
Date:       2013-10-11 9:30:34
Message-ID: 5257C53A.6040601 () gmail ! com
[Download RAW message or body]

Il 11/10/2013 10:46, Woody Wu ha scritto:
> On Thu, Oct 10, 2013 at 09:30:23AM +0200, onetmt wrote:
> > Il 10/10/2013 06:55, Woody Wu ha scritto:
> > > Hi,
> > > 
> > > I am about to write a test runner with GTK+. It basically can list a lot
> > > of external test programs (non-GTK+ pure Linux apps) in a treeview and
> > > let user select one of them to run. While an external program is
> > > running, I want to get all its outputs (to stdout/stderr) and keep
> > > updating in a textview.
> > > 
> > > Since I am a Linux programmer, so I know how to fork a new process and
> > > pipe into an external program. But I don't know in GTK+, what's the
> > > right method to keep fetching the information from the pipe and showing
> > > them in my GUI widgets.  On the other hand, while an external program is
> > > running, I don't want user feel that the my program is frozing and user
> > > should be able to kill the running external program by clicking a 'stop'
> > > button on the GUI.
> > > 
> > > For this kind of task, what GTK+ technology I should go to grab?  Thanks
> > > in advance!
> > > 
> > 
> > Hope you like pyhton :)
> > 
> 
> I know python. But I have to use a GUI as runner for this time.

Actually, it does have a GUI (test_pygtk.ui is a gtk-builder file :)

> 
> > 
> > -- 
> > Hofstadter's Law:
> > "It always takes longer than you expect, even when you take into account
> > Hofstadter's Law."
> 
> 
> > # -*- coding: UTF-8 -*-
> > 
> > import gobject
> > import gtk
> > import subprocess
> > 
> > class load_ng:
> > def __init__(self):
> > ###
> > # Initialize the data
> > ###
> > self.error = 0
> > 	self.base = '0xB0'
> > self.com = ["ls","-l"]
> > self.log = open('test_pygtk.log', 'w')
> > ###
> > # Initialize the gui
> > ###
> > self.builder = gtk.Builder()
> > self.builder.add_from_file("test_pygtk.ui")
> > self.window = self.builder.get_object("window_main")
> > # 
> > text = self.builder.get_object("txt_console")
> > self.txt_buf = text.get_buffer()
> > self.ok_tag = self.txt_buf.create_tag("ok", foreground="lightgreen", weight=700)
> > self.ko_tag = self.txt_buf.create_tag("ko", foreground="red", weight=700)
> > self.err_tag = self.txt_buf.create_tag("err", foreground="red")
> > 
> > # connect signals
> > self.builder.connect_signals(self)
> > 
> > def on_btn_check_clicked(self, widget):
> > # resetto il flag di errore
> > self.error = 0
> > 
> > self.test_launch()        
> > itr = self.txt_buf.get_end_iter()
> > if self.error != 0:
> > self.txt_buf.insert_with_tags(itr, "Unexpected error; please see \nlog file for \
> > futher details.\n", self.err_tag) else:
> > self.txt_buf.insert(itr, "###\n")            
> > 
> > def on_btn_quit_clicked(self, widget):
> > self.log.close()
> > gtk.main_quit()
> > 
> > def on_window_main_destroy(self, widget, data=None):
> > self.log.close()
> > gtk.main_quit()
> > 
> > def test_launch(self):
> > # if you want, you can change command options here:
> > self.com[1] = "-la"
> > 
> > itr = self.txt_buf.get_end_iter()
> > self.txt_buf.insert(itr, "Launching command...\t\t\t\t\t\t")
> > while gtk.events_pending():
> > gtk.main_iteration_do(False)
> > 
> > risposta = subprocess.Popen(self.com, stdout=subprocess.PIPE).communicate()[0]
> > lines = risposta.split('\n')
> > 
> > stato = False
> > for line in lines:
> > # maybe a better test can be designed ;)
> > if '.' not in line:
> > stato = True
> > 
> > if stato:
> > self.txt_buf.insert_with_tags(itr, "[OK]\n", self.ok_tag)
> > self.txt_buf.insert(itr, risposta)
> > else:
> > self.txt_buf.insert_with_tags(itr, "[Failed]\n", self.ko_tag)
> > self.error = 1
> > self.log.writelines(risposta)
> > 
> > def main(self):
> > self.window.show()
> > gtk.main()
> > 
> > pass
> > 
> > if __name__=='__main__':
> > app = load_ng()
> > app.window.show()
> > gtk.main()
> > 
> 
> > _______________________________________________
> > gtk-list mailing list
> > gtk-list@gnome.org
> > https://mail.gnome.org/mailman/listinfo/gtk-list
> 
> 


-- 
Hofstadter's Law:
"It always takes longer than you expect, even when you take into account
Hofstadter's Law."
_______________________________________________
gtk-list mailing list
gtk-list@gnome.org
https://mail.gnome.org/mailman/listinfo/gtk-list


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic