<p>其中一个方法是:</p>
<ul>
<li>创建一个<code>Text</code>框以显示命令输出</li>
<li>创建一个线程化任务以获取流程输出,并将输出放入队列中</li>
<li>创建定期任务以从队列中获取输出,并将其插入文本框</li>
<li>使用<code>subprocess.PIPE</code>重定向命令输出</li>
</ul>
<pre class="lang-py prettyprint-override"><code>import sys
import threading
from queue import Queue
from subprocess import Popen, PIPE
from tkinter import Tk, Button, messagebox, Label, Text
...
process = None
queue = Queue()
def run_server():
global process
if process:
process.terminate()
#process = Popen(['python', 'C:/Test/Turnstile/manage.py', 'runserver'])
process = Popen([sys.executable, '-u', 'C:/Test/Turnstile/manage.py', 'runserver'], stdout=PIPE, bufsize=1, text=True)
...
output = Text(gui, width=100, height=20)
output.pack(padx=20, pady=20)
def monitor_output(q):
while True:
if process and process.stdout:
msg = process.stdout.readline()
if msg:
q.put(msg)
def check_output(q):
while not q.empty():
output.insert('end', q.get())
output.see('end')
gui.after(10, check_output, q)
threading.Thread(target=monitor_output, args=[queue], daemon=True).start()
check_output(queue)
gui.mainloop()
</code></pre>
<p>注意,我使用了<code>sys.executable</code>而不是<code>'python'</code>来确保使用相同的Python解释器</p>