使用 tkinter 文本小部件作为另一个程序的标准输出
Use a tkinter Text widget as stdout for another program
我正在尝试为另一个仅使用命令行界面的程序制作图形界面。我试图通过将命令行程序输出到 tkinter 文本小部件来实现这一点。我发现了几个关于将标准输出重定向到文本小部件的问题,但是,我无法将其中任何一个应用于我的问题。这是我的代码的简化版本,它存在同样的问题:
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 window 打开一个空的文本小部件。我尝试使用 file
对象代替文本小部件,并将数字 10-99 保存到其中。在调试时,我发现 write
方法实际上从未被调用过,但我必须有一个 fileno
方法,其中 returns 一个整数。
编辑 #1:This 解决方案确实适用于我的示例代码,但是在我的实际项目中,我需要传递命令行参数。
编辑 #2:我添加了一个命令行参数来演示上述内容。
编辑 #3:我应该早点说,但我确实需要实时输出。
试试这个代码
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()
我正在尝试为另一个仅使用命令行界面的程序制作图形界面。我试图通过将命令行程序输出到 tkinter 文本小部件来实现这一点。我发现了几个关于将标准输出重定向到文本小部件的问题,但是,我无法将其中任何一个应用于我的问题。这是我的代码的简化版本,它存在同样的问题:
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 window 打开一个空的文本小部件。我尝试使用 file
对象代替文本小部件,并将数字 10-99 保存到其中。在调试时,我发现 write
方法实际上从未被调用过,但我必须有一个 fileno
方法,其中 returns 一个整数。
编辑 #1:This 解决方案确实适用于我的示例代码,但是在我的实际项目中,我需要传递命令行参数。
编辑 #2:我添加了一个命令行参数来演示上述内容。
编辑 #3:我应该早点说,但我确实需要实时输出。
试试这个代码
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()