Используйте текстовый виджет tkinter как стандартный вывод для другой программы - PullRequest
0 голосов
/ 21 апреля 2019

Я пытаюсь создать графический интерфейс для другой программы, которая просто использует интерфейс командной строки.Я пытаюсь сделать это путем вывода программы из командной строки в текстовый виджет tkinter.Я нашел несколько вопросов о перенаправлении stdout в текстовый виджет, однако я не смог применить ни один из них к моей проблеме.Вот упрощенная версия моего кода, которая представляет ту же проблему:

Программа с графическим интерфейсом:

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 с пустым виджетом Text.Я попытался использовать объект file вместо текстового виджета, и цифры 10-99 сохраняются в нем.Во время отладки я обнаружил, что метод write фактически никогда не вызывается, но у меня должен быть метод fileno, который возвращает целое число.


Правка # 1: This решение работает для моего примера кода, однако в моем реальном проекте мне нужно передать аргументы командной строки.

Редактировать # 2: я добавил аргумент командной строки, чтобы продемонстрировать вышеприведенное.

Правка № 3: Я должен был сказать раньше, но мне нужно нужно, чтобы вывод происходил в реальном времени.

1 Ответ

1 голос
/ 22 апреля 2019

попробуйте этот код

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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...