subprocess.call()与GUI交互(Tkinter)

时间:2012-06-05 00:18:49

标签: python python-2.7 tkinter subprocess

有没有办法使用subprocess.call()subprocess.Popen()并通过Tkinter的Entry小部件与stdin交互,并将stdout输出到Text小部件?

我不确定如何处理这样的事情,因为我是使用subprocess模块的新手。

1 个答案:

答案 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)

但我建议阅读人们已经实现这一目标的其他例子。