2012-06-05 160 views
3

有没有办法使用subprocess.call()subprocess.Popen()并通过的Tkinter的Entry插件的标准输入和输出交互的标准输出到Text小部件?subprocess.call()与GUI(Tkinter的)交互

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

+0

哇哈哈,第一次我的一个问题就连一天都没有发表评论; P –

+1

有很多SO和其他地方的答案(例如http://stackoverflow.com/questions/665566/python-tkinter -shell-to-gui)将stdout重定向到Tkinter小部件。但是,我也想知道如何将stdin从GUI小部件传递给子进程,如果有人碰巧知道! – Jdog

+0

是的,我想知道如何让STDIN工作(这将是awsome!xD),但是链接:) –

回答

1

认为我已经有了使用Entry作为标准输入到子进程的基础知识。您可能需要根据自己的需要来调整它(重新输出到Text小部件)。

此示例调用一个测试脚本:

# test.py: 

#!/usr/bin/env python 
a = raw_input('Type something!: \n') #the '\n' flushes the prompt 
print a 

,仅仅需要一些输入(从sys.stdin)并打印。

调用此并通过图形用户界面与它交互与完成:

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() 

现在无论是键入Entrye(其次为Return键),然后通过标准输入传递给proc

希望这会有所帮助。


另请参阅this了解有关子流程问题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) 

,但我会建议你阅读,人们已经实现了这个其他的例子。

+0

用Python对象替换'sys.stdout'不会影响'subprocess''stdout,请参见[这个答案](http://stackoverflow.com/a/22434262/4279)。要在GUI小部件中显示子进程的stdout,请参阅[本答案](http://stackoverflow.com/a/32682520/4279) – jfs