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. > > -- > 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@xxxxxxxxx > https://mail.gnome.org/mailman/listinfo/gtk-list -- I can't go back to yesterday - because I was a different person then _______________________________________________ gtk-list mailing list gtk-list@xxxxxxxxx https://mail.gnome.org/mailman/listinfo/gtk-list