我正在创建一个带有文本框和运行按钮的简单IDE。这要求用户输入文件名,写入写入文件的代码并运行该文件。 我想显示从控制台输出的任何内容,例如打印,输入等......就像IDE一样。 这可能吗?
这是我的代码:
from Tkinter import *
import tkFileDialog
import ScrolledText
import subprocess
filepath=""
def run():
global filepath
print "<<<<<<=====-------------Restart-------------=====>>>>>>"
py=code.get(1.0,END)
if filepath=="":
filepath=tkFileDialog.asksaveasfilename()
if ".py" not in filepath:
filepath=filepath+".py"
script=open(filepath, "w")
script.write(py)
script.close()
p = subprocess.Popen(['python', filepath],
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
)
for line in iter(p.stdout.readline, ''):
print line
print "<<<<<<=====-------------EXECUTION FINISHED-------------=====>>>>>>"
root = Tk()
code=ScrolledText.ScrolledText(root)
code.pack()
run=Button(root,text="Run", command=run)
run.pack()
root.mainloop()
答案 0 :(得分:1)
是的,只需使用subprocess模块。
一次性输出
import subprocess
output = subprocess.check_output(['python', filepath])
如果要从被调用的进程中捕获标准错误以及标准输出,请改为使用它:
output = subprocess.check_output(['python', filepath], stderr=subprocess.STDOUT)
或者如果你想分别捕捉它们:
p = subprocess.Popen(['python', filepath],
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
)
out, err = p.communicate()
获取产出后的输出
这为您提供了逐行合并的stdout和strerr输出:
p = subprocess.Popen(['python', filepath],
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
)
for line in iter(p.stdout.readline, ''):
# process the line
保持用户界面响应
如果在与GUI相同的线程上运行上述代码,则在等待每一行时,实际上阻止了Tk的事件循环运行。这意味着虽然您实时获取每一行并将其写入GUI,但在事件循环再次运行之前它不会更新显示,并处理您对Tk的所有调用。
您需要在新线程上运行子流程代码,并在GUI线程中定期检查新输入。
我已经为你做了一个基于你的例子,你可以在这里找到它: