简体   繁体   English

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

[英]subprocess.call() interacting with GUI (Tkinter)

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

Im not really sure how to approach something like this, as i am new to using the subprocess module. 我不确定如何处理这样的事情,因为我是使用subprocess模块的新手。

Think I've got the basics of using an Entry as stdin to subprocess. 我认为我已经掌握了使用Entry作为stdin进行子处理的基础知识。 You may have to jiggle it about for your own needs (re: output to Text widget). 您可能需要根据自己的需要进行抖动(re:输出到Text小部件)。

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. 只需要一些输入(来自sys.stdin )并打印它。

Calling this and interacting with it via a GUI is done with: 调用它并通过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()

Now whatever is typed into Entry e (followed by the Return key), is then passed via stdin to proc . 现在无论是输入到Entry e (其次是Return键),然后通过标准输入传递给proc

Hope this helps. 希望这可以帮助。


Also check this for ideas about stdout of subprocess question. 还要检查这个有关子进程问题的stdout的想法。 You'll need to write a new stdout to redirect stdout to the textwidget, something like: 你需要编写一个新的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)

but I would recommend reading other examples where people have achieved this. 但我建议阅读人们已经实现这一目标的其他例子。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM