擅长:python、mysql、java
<p><code>Popen</code>不支持上下文管理器(即<code>with</code>),因此出现错误。但也要注意,两个版本的代码没有实际的区别。在</p>
<p>你可以逐行阅读:</p>
<pre><code>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()
</code></pre>
<p>行<code>for line in iter(child.stdout.readline, ''):</code>用于绕过如果循环是<code>for line in child.stdout:</code>将经历的缓冲。在</p>
<hr/>
<p><strong>更新</strong></p>
<p>尝试按如下方式修改代码:</p>
^{pr2}$
<p>变化包括:</p>
<ol>
<li>在子级中使用<code>-u</code>python选项进行无缓冲输出</li>
<li>调用<code>text.see(END)</code>将文本窗口滚动到底部
每次插入</li>
<li>呼叫<code>text.update_idletasks()</code>给Tkinter一个更新的机会
文本小部件。在</li>
</ol>
<p>这可能有助于避免使用线程,但其缺点是,在执行回调时,GUI的其余部分将无响应。如果子进程的生命周期很短,那么这可能是可以接受的,如果子进程运行了很长一段时间,则可能无法接受,这取决于您的应用程序。在</p>