使用tkinter文本小部件作为另一个程序的标准输出

2024-04-26 06:40:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试为另一个只使用命令行界面的程序创建一个图形界面。我试图通过将命令行程序输出到tkinter文本小部件来实现这一点。我发现了一些关于将stdout重定向到文本小部件的问题,但是,我还没有将它们应用到我的问题中。下面是我的代码的简化版本,它提出了相同的问题:

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方法返回一个整数。你知道吗


Edit#1:This解决方案确实适用于我的示例代码,但是在我的实际项目中,我需要传递命令行参数。你知道吗

编辑#2:我添加了一个命令行参数来演示上述内容。你知道吗

编辑#3:我应该早点说,但我确实需要实时输出。你知道吗


Tags: run代码命令行文本importself程序部件
1条回答
网友
1楼 · 发布于 2024-04-26 06:40:35

尝试此代码

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()

相关问题 更多 >