在Python中逐行输出到GUI

时间:2015-04-27 04:05:47

标签: python python-2.7 user-interface tkinter

我想在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应该迭代地打印输出,就像它在终端上打印一样。

所以,我尝试了这个,但是在点击按钮

时给了我一个错误
def get_likes_button():
    text.delete("1.0",END)
    with subprocess.Popen(['python', "getLikes.py"], stdout=subprocess.PIPE) as output:
        s1 = output.stdout.read()
        text.insert(INSERT,s1)

错误是

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__

你能告诉我该怎么做吗?

2 个答案:

答案 0 :(得分: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:时会遇到的缓冲。

<强>更新

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

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

变化是:

  1. 对子项中的无缓冲输出使用-u python选项
  2. 调用text.see(END)将文本窗口滚动到底部 每个插入,
  3. 致电text.update_idletasks(),让Tkinter有机会更新 文本小部件。
  4. 这可能有助于避免使用线程,但其中一个缺点是GUI的其余部分在您的回调执行时将无响应。如果你的孩子过程是短暂的,那么这可能是可以接受的,如果孩子长时间跑步可能不会 - 这取决于你的申请。

答案 1 :(得分:1)

我不认为0x00000011可以在(CURLOPT_SSL_VERIFYPEER => 0, CURLOPT_SSL_VERIFYHOST => 0,) 子句中使用。我认为subprocess.Popen就是你所需要的:

with