我想用python将stdout打印到GUI。我用的是Tkinter。 这就是我为我工作的东西
def get_likes_button():
output = subprocess.Popen(['python', "getLikes.py"], stdout=subprocess.PIPE)
s1 = output.stdout.read()
text.delete("1.0",END)
text.insert(INSERT,s1)
但是,我一下子就得到了全部输出。 我想要的是GUI应该迭代地打印输出,就像它在终端上打印一样。在
所以,我试过了,但是它给了我一个点击按钮的错误
^{pr2}$错误是
Exception in Tkinter callback
Traceback (most recent call last):
File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1489, in __call__
return self.func(*args)
File "gui.py", line 88, in get_likes_button
with subprocess.Popen(['python', "getLikes.py"], stdout=subprocess.PIPE) as output:
AttributeError: __exit__
你能建议我怎么做吗?在
Popen
不支持上下文管理器(即with
),因此出现错误。但也要注意,两个版本的代码没有实际的区别。在你可以逐行阅读:
行
for line in iter(child.stdout.readline, ''):
用于绕过如果循环是for line in child.stdout:
将经历的缓冲。在更新
尝试按如下方式修改代码:
^{pr2}$变化包括:
-u
python选项进行无缓冲输出text.see(END)
将文本窗口滚动到底部 每次插入text.update_idletasks()
给Tkinter一个更新的机会 文本小部件。在这可能有助于避免使用线程,但其缺点是,在执行回调时,GUI的其余部分将无响应。如果子进程的生命周期很短,那么这可能是可以接受的,如果子进程运行了很长一段时间,则可能无法接受,这取决于您的应用程序。在
我不认为
subprocess.Popen
可以在with
子句中使用。我认为check_output
就是你需要的:相关问题 更多 >
编程相关推荐