3

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

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

4

1 回答 1

2

认为我已经掌握了使用Entryas 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)

但我建议阅读人们已经实现这一目标的其他示例。

于 2012-06-05T15:59:14.510 回答