有没有办法使用subprocess.call()
或subprocess.Popen()
并通过Tkinter的Entry
小部件与stdin交互,并将stdout输出到Text
小部件?
我不确定如何处理这样的事情,因为我是使用subprocess
模块的新手。
答案 0 :(得分:1)
认为我已经掌握了使用Entry
作为stdin进行子进程的基础知识。您可能需要根据自己的需要进行微动(re:输出到Text
小部件)。
此示例调用测试脚本:
# test.py:
#!/usr/bin/env python
a = raw_input('Type something!: \n') #the '\n' flushes the prompt
print a
只需要一些输入(来自sys.stdin
)并打印出来。
调用它并通过GUI与它进行交互完成:
from Tkinter import *
import subprocess
root = Tk()
e = Entry(root)
e.grid()
b = Button(root,text='QUIT',command=root.quit)
b.grid()
def entryreturn(event):
proc.stdin.write(e.get()+'\n') # the '\n' is important to flush stdin
e.delete(0,END)
# when you press Return in Entry, use this as stdin
# and remove it
e.bind("<Return>", entryreturn)
proc = subprocess.Popen('./test.py',stdin=subprocess.PIPE)
root.mainloop()
现在无论输入Entry
e
(后跟Return
键),都会通过stdin传递给proc
。
希望这有帮助。
同时检查this有关子流程问题的stdout的想法。您需要编写一个新的stdout来将stdout重定向到textwidget,如:
class MyStdout(object):
def __init__(self,textwidget):
self.textwidget = textwidget
def write(self,txt):
self.textwidget.insert(END,txt)
sys.stdout = MyStdout(mytextwidget)
但我建议阅读人们已经实现这一目标的其他例子。