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 一起工作?