擅长:python、mysql、java
<p>我有答案,以防有人还在乎!(我还改为python3,因此<code>import tkinter</code>而不是{<cd2>})</p>
<p>与原来的方法略有不同,我使用一个单独的文件来运行<code>InteractiveConsole</code>,然后让主文件打开另一个文件(我调用了这个文件控制台.py并位于子进程的<strong>同一目录下</strong>),链接stdout、stderr,并将此子进程的stdin程序化到tkinter文本小部件。在</p>
<p>以下是中用于控制台文件的代码(如果正常运行,则其作用类似于普通控制台):</p>
<pre><code># console.py
import code
if __name__ == '__main__':
vars = globals().copy()
vars.update(locals())
shell = code.InteractiveConsole(vars)
shell.interact()
</code></pre>
<p>下面是python解释器的代码,它在文本小部件中运行控制台:</p>
^{pr2}$
<p>从stdout和stderr读取的原因是由于read方法阻塞,这会导致程序冻结,直到控制台.py子进程提供更多的输出,除非这些输出在单独的线程中。因为tkinter不是线程安全的,所以需要writeLoop方法和队列来写入文本小部件。在</p>
<p>这当然还有一些问题需要解决,比如文本小部件上的任何代码即使已经提交也可以编辑,但希望它能回答您的问题。在</p>
<p>编辑:我还整理了一些tkinter,使控制台的行为更像一个标准的小部件。在</p>