Is there any way to use subprocess.call()
or subprocess.Popen()
and interact with the stdin via Tkinter's Entry
widget, and output the stdout to a Text
widget?
Im not really sure how to approach something like this, as i am new to using the subprocess
module.
Think I've got the basics of using an Entry
as stdin to subprocess. You may have to jiggle it about for your own needs (re: output to Text
widget).
This example calls a test script:
# test.py:
#!/usr/bin/env python
a = raw_input('Type something!: \n') #the '\n' flushes the prompt
print a
that simply requires some input (from sys.stdin
) and prints it.
Calling this and interacting with it via a GUI is done with:
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()
Now whatever is typed into Entry
e
(followed by the Return
key), is then passed via stdin to proc
.
Hope this helps.
Also check this for ideas about stdout of subprocess question. You'll need to write a new stdout to redirect stdout to the textwidget, something like:
class MyStdout(object):
def __init__(self,textwidget):
self.textwidget = textwidget
def write(self,txt):
self.textwidget.insert(END,txt)
sys.stdout = MyStdout(mytextwidget)
but I would recommend reading other examples where people have achieved this.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.