有没有办法使用subprocess.call()
或subprocess.Popen()
并通过的Tkinter的Entry
插件的标准输入和输出交互的标准输出到Text
小部件?subprocess.call()与GUI(Tkinter的)交互
我不太确定如何处理这样的事情,因为我是使用subprocess
模块的新手。
有没有办法使用subprocess.call()
或subprocess.Popen()
并通过的Tkinter的Entry
插件的标准输入和输出交互的标准输出到Text
小部件?subprocess.call()与GUI(Tkinter的)交互
我不太确定如何处理这样的事情,因为我是使用subprocess
模块的新手。
认为我已经有了使用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()
现在无论是键入Entry
e
(其次为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)
,但我会建议你阅读,人们已经实现了这个其他的例子。
用Python对象替换'sys.stdout'不会影响'subprocess''stdout,请参见[这个答案](http://stackoverflow.com/a/22434262/4279)。要在GUI小部件中显示子进程的stdout,请参阅[本答案](http://stackoverflow.com/a/32682520/4279) – jfs
哇哈哈,第一次我的一个问题就连一天都没有发表评论; P –
有很多SO和其他地方的答案(例如http://stackoverflow.com/questions/665566/python-tkinter -shell-to-gui)将stdout重定向到Tkinter小部件。但是,我也想知道如何将stdin从GUI小部件传递给子进程,如果有人碰巧知道! – Jdog
是的,我想知道如何让STDIN工作(这将是awsome!xD),但是链接:) –