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

Posted

技术标签:

【中文标题】subprocess.call() 与 GUI (Tkinter) 交互【英文标题】:subprocess.call() interacting with GUI (Tkinter) 【发布时间】:2012-06-09 01:03:15 【问题描述】:

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

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

【问题讨论】:

哇哈哈,第一次我的一个问题一天都没有评论;P 在 SO 和其他地方(例如 ***.com/questions/665566/python-tkinter-shell-to-gui)有很多答案可以将标准输出重定向到 Tkinter 小部件。但是,如果有人碰巧知道,我也想知道如何将标准输入从 GUI 小部件传递给子进程! 是的,我想知道如何让 STDIN 工作(那太棒了!xD)但是链接:) 【参考方案1】:

认为我已经掌握了使用Entry 作为子进程的标准输入的基础知识。您可能需要根据自己的需要调整它(re: output to 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 键)中的任何内容都会通过标准输入传递给proc

希望这会有所帮助。


还可以查看this 了解有关子流程问题标准输出的想法。您需要编写一个新的标准输出来将标准输出重定向到文本小部件,例如:

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' 标准输出,请参阅 this answer。要在 GUI 小部件中显示子进程的标准输出,请参阅 this answer

以上是关于subprocess.call() 与 GUI (Tkinter) 交互的主要内容,如果未能解决你的问题,请参考以下文章

subprocess.call() 如何与 shell=False 一起工作?

从 GUI 运行脚本

使用带有参数的 subprocess.call [重复]

python子进程模块subprocess详解与应用实例 之三

Python 调用外部命令:subprocess 模块

subprocess.call 使用