Я пытаюсь создать графический интерфейс для другой программы, которая просто использует интерфейс командной строки.Я пытаюсь сделать это путем вывода программы из командной строки в текстовый виджет 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: Я должен был сказать раньше, но мне нужно нужно, чтобы вывод происходил в реальном времени.