用Python将逐行输出打印到GUI

2024-10-01 11:20:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我想用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__

你能建议我怎么做吗?在


Tags: textinpyoutputgettkinterstdoutgui
2条回答

Popen不支持上下文管理器(即with),因此出现错误。但也要注意,两个版本的代码没有实际的区别。在

你可以逐行阅读:

def get_likes_button():
    child = subprocess.Popen(['python', 'getLikes.py'], stdout=subprocess.PIPE)
    text.delete("1.0",END)
    for line in iter(child.stdout.readline, ''):
        text.insert(INSERT, line)
    child.stdout.close()
    child.wait()

for line in iter(child.stdout.readline, ''):用于绕过如果循环是for line in child.stdout:将经历的缓冲。在


更新

尝试按如下方式修改代码:

^{pr2}$

变化包括:

  1. 在子级中使用-upython选项进行无缓冲输出
  2. 调用text.see(END)将文本窗口滚动到底部 每次插入
  3. 呼叫text.update_idletasks()给Tkinter一个更新的机会 文本小部件。在

这可能有助于避免使用线程,但其缺点是,在执行回调时,GUI的其余部分将无响应。如果子进程的生命周期很短,那么这可能是可以接受的,如果子进程运行了很长一段时间,则可能无法接受,这取决于您的应用程序。在

我不认为subprocess.Popen可以在with子句中使用。我认为check_output就是你需要的:

output = subprocess.check_output(['python', 'getLikes.py'])

相关问题 更多 >