我正在尝试为另一个仅使用命令行界面的程序创建图形界面。我正在尝试通过将命令行程序输出到tkinter Text小部件来实现此目的。我发现了一些有关将stdout重定向到Text小部件的问题,但是,我无法将其中的任何一个用于我的问题。这是我的代码的简化版本,它也存在相同的问题:
GUI程序:
import threading, subprocess, sys
from tkinter import *
class Out(Text):
def write(self, text):
self.insert('end', text)
self.see('end')
def fileno(self):return 1
def run():
sys.stdout = out
subprocess.run(['test2.py', '10'], stdout=out, shell=True)
sys.stdout = sys.__stdout__
root = Tk()
out = Out(root)
out.pack()
threading.Thread(target=run).start()
mainloop()
命令行程序(testpt2.py
在同一目录中):
import time, sys
i = int(sys.argv[1])
while i < 100:
print(i)
i += 1
time.sleep(0.1)
此代码的问题是,在任何地方都没有输出。所发生的就是打开一个带有空文本小部件的tkinter窗口。我尝试使用file
对象代替“文本”窗口小部件,并将数字10-99保存到其中。调试时,我发现实际上从未调用过write
方法,但是我必须有一个返回整数的fileno
方法。
编辑#1:This解决方案确实适用于我的示例代码,但是在我的实际项目中,我需要传递命令行参数。
编辑#2:我添加了一个命令行参数来演示上面的内容。
编辑#3:我应该早一点说,但是我要做需要输出实时发生。
答案 0 :(得分:1)
尝试此代码
import threading
from tkinter import *
from subprocess import Popen, PIPE, run
class Out(Text):
def write(self, text):
self.insert('end', text)
self.see('end')
def fileno(self):return 1
root = Tk()
out = Out(root)
def run():
global out
process = Popen(['python','-u','test2.py','10'], stdin=PIPE, stdout=PIPE, bufsize=1)
while process.poll() is None:
out.write(process.stdout.readline())
out.pack()
threading.Thread(target=run).start()
mainloop()