有没有办法通过 Tkinter 的小部件使用标准输入subprocess.call()
或与标准输入交互,并将标准输出输出到小部件?subprocess.Popen()
Entry
Text
我不确定如何处理这样的事情,因为我是使用该subprocess
模块的新手。
有没有办法通过 Tkinter 的小部件使用标准输入subprocess.call()
或与标准输入交互,并将标准输出输出到小部件?subprocess.Popen()
Entry
Text
我不确定如何处理这样的事情,因为我是使用该subprocess
模块的新手。
认为我已经掌握了使用Entry
as 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
.
希望这可以帮助。
还要检查这个关于子流程问题的标准输出的想法。您需要编写一个新的标准输出来将标准输出重定向到文本小部件,例如:
class MyStdout(object):
def __init__(self,textwidget):
self.textwidget = textwidget
def write(self,txt):
self.textwidget.insert(END,txt)
sys.stdout = MyStdout(mytextwidget)
但我建议阅读人们已经实现这一目标的其他示例。