在 tkinter 小部件中显示子进程的实时输出 [英] Display realtime output of a subprocess in a tkinter widget

查看:99
本文介绍了在 tkinter 小部件中显示子进程的实时输出的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的问题和这个差不多:显示子进程标准输出的小部件?但更进一步.

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

我有以下代码(python2.7):

I have the following code (python2.7):

def btnGoClick(p1):
    params = w.line.get()
    if len(params) == 0:
        return

    # create child window
    win = tk.Toplevel()
    win.title('Bash')
    win.resizable(0, 0)
    # create a frame to be able to attach the scrollbar
    frame = ttk.Frame(win)
    # the Text widget - the size of the widget define the size of the window
    t = tk.Text(frame, width=80, bg="black", fg="green")
    t.pack(side="left", fill="both")
    s = ttk.Scrollbar(frame)
    s.pack(side="right", fill="y")
    # link the text and scrollbar widgets
    s.config(command=t.yview)
    t.config(yscrollcommand=s.set)
    frame.pack()

    process = subprocess.Popen(["<bashscript>", params], shell=False,
        stdout=subprocess.PIPE, stderr=subprocess.STDOUT)

    while True:
        out = process.stdout.readline()
        if out == '' and process.poll() is not None:
            break
        print out
        t.insert(tk.END, out)

longrunning"bash 脚本的输出被实时捕获(出现在控制台中),但 Tkinter 窗口仅在子进程结束后出现!!

The output from the "longrunning" bash script is captured in realtime (appear in the console) but the Tkinter window appear only after the end of the subprocess !!

如何在子进程启动之前显示窗口并实时更新其内容?

How can I have the window appearing before the subprocess start and update its content in realtime ?

推荐答案

我终于找到了解决方案.在窗口构建之后,必须添加:

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()

这篇关于在 tkinter 小部件中显示子进程的实时输出的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆