我的问题和这个差不多:显示子进程标准输出的小部件?但更进一步.
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 小部件中显示子进程的实时输出
发布评论