请参考以下代码: 我能够实时打印两个打印语句(#1和#2)(逐行)。但是,文本小部件仅在执行子进程csh脚本后才会出现。
当我能够打印从子流程的stdout收到的值时,为什么它不显示在文本小部件上?
#!/tools//python/2.7.2/bin/python -u
import os
import ttk
from Tkinter import *
import subprocess
import sys
t = Tk()
t.title('New title')
t.geometry('800x1000-5+40')
t.state('normal')
little = Label(t, text="OUTPUT LOG").grid(column = 0, row = 0)
log = Text(t, state='normal', width=115, height=150, wrap='none')
log.grid(row = 1, column = 0)
test=subprocess.Popen("tem",shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
#tem is a csh file which print number from 1 to 1000
#stdout
cnt = 0.0
while True:
line = test.stdout.readline()
cnt += 1
if line == "":
break
else:
log['state'] = 'normal'
log.insert(cnt,line)
print 'line #' #1
print line #2
log['state'] = 'disabled'
t.mainloop()
答案 0 :(得分:0)
问题是必须必须服务事件才能使显示更新。这是Tk(以及Tkinter)工作方式的基础。 Python中最简单的方法可能是将子进程的读取放在自己的线程中,然后将消息中的每一行发送到主GUI线程进行显示。