Display realtime output of a subprocess in a tkinter widget

前端 未结 3 1666
灰色年华
灰色年华 2020-11-27 21:45

My question is almost the same as this one: Widget to Display subprocess stdout? but a step further.

I have the following code (python2.7):

def btnGo         


        
相关标签:
3条回答
  • 2020-11-27 22:21

    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.

    0 讨论(0)
  • 2020-11-27 22:22

    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

    0 讨论(0)
  • 2020-11-27 22:41

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

    frame.pack()
    # force drawing of the window
    win.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 widget
    t.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 displayed
    t.update_idletasks()
    
    0 讨论(0)
提交回复
热议问题