Display realtime output of a subprocess in a tkinter widget Display realtime output of a subprocess in a tkinter widget tkinter tkinter

Display realtime output of a subprocess in a tkinter widget


Finally I found the solution.After the window construction, you must add :

frame.pack()# force drawing of the windowwin.update_idletasks()

And then after every line insertion in the widget, you must also force a refresh with the same method only on the widget.

# insert the line in the Text widgett.insert(tk.END, out)# force widget to display the end of the text (follow the input)t.see(tk.END)# force refresh of the widget to be sure that thing are displayedt.update_idletasks()


This is an interesting solution. Would that be possible to have the whole working code?

I am asking because I was wonder how the while True does not block the usability of the whole GUI... does it not?

As suspected, I tried and this example is not really work. If you use something like "ls -Rf /" as command, you will see that the while loop will make the txt output flowing pretty well. However both windows (main and secondary) will block big time.

I suspect you need to send the print txt part in a separated thread or process. Or, if you use pygtk you can use stuff like

gobject.io_add_watch(self.ep1.stdout,       # file descriptor                     gobject.IO_IN,         # condition                     self.write_to_buffer ) # callback

which was actually invented for this.


Just in case someone else is looking for it...

log_box_1 = tk.Text(root, borderwidth=3, relief="sunken")with subprocess.Popen("ls -la", shell=True, stdout=subprocess.PIPE, bufsize=1, universal_newlines=True) as p:            for line in p.stdout:                log_box_1.insert(tk.END, line)

From here