我想在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__
你能告诉我该怎么做吗?
答案 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()
变化是:
-u
python选项text.see(END)
将文本窗口滚动到底部
每个插入,text.update_idletasks()
,让Tkinter有机会更新
文本小部件。这可能有助于避免使用线程,但其中一个缺点是GUI的其余部分在您的回调执行时将无响应。如果你的孩子过程是短暂的,那么这可能是可以接受的,如果孩子长时间跑步可能不会 - 这取决于你的申请。
答案 1 :(得分:1)
我不认为0x00000011
可以在(CURLOPT_SSL_VERIFYPEER => 0, CURLOPT_SSL_VERIFYHOST => 0,)
子句中使用。我认为subprocess.Popen
就是你所需要的:
with