Как перенаправить выводимый текст в отдельное окно в Python?Python

Программы на Python
Anonymous
Как перенаправить выводимый текст в отдельное окно в Python?

Сообщение Anonymous »

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

Код: Выделить всё

import tkinter as tk
from tkinter import scrolledtext
import sys
import io

class TextWidgetStream(io.TextIOBase):
def __init__(self, text_widget, tag="stdout"):
super().__init__()
self.text_widget = text_widget
self.tag = tag  # Tag for coloring

def write(self, s):
self.text_widget.after(0, self._insert_text, s)

def _insert_text(self, s):
self.text_widget.config(state='normal')
self.text_widget.insert('end', s, (self.tag,))
self.text_widget.see('end') #Auto-scroll to bottom
self.text_widget.config(state='disabled')

def flush(self):
pass #Required for stream compliance

class OutputRedirectorGUI:
def __init__(self, root):
self.root = root
self.root.title("Title")
self.root.geometry("800x600")

#Save original Streams
self.original_stdout = sys.stdout
self.original_stderr = sys.stderr

#Create and configure Text widget w/ scrollbar
self.text_widget = scrolledtext.ScrolledText(
root,
wrap=tk.WORD,
state=tk.DISABLED,
bg="#020501",
font=("Good Old DOS", 15)
)
self.text_widget.pack(padx=10, pady=10, fill = "both", expand=True)

#Configure tags for stdout(black) & stderr (red)
self.text_widget.tag_configure("stdout", foreground = "green4")
self.text_widget.tag_configure("stderr", foreground = "red")

# Redirect stdout and stderr:
self.stdout_redirector = TextWidgetStream(self.text_widget, tag="stdout")
self.stderr_redirector = TextWidgetStream(self.text_widget, tag="stderr")
sys.stdout = self.stdout_redirector
sys.stderr = self.stderr_redirector

#Restore streams on exit
self.root.protocol("WM_DELETE_WINDOW", self.on_exit)

def on_exit(self):
#Restore original streams before closing
sys.stdout = self.original_stdout
sys.stderr = self.original_stderr
self.root.destroy()
После этого моя исходная программа по сути представляет собой просто функцию def main() с циклом while, который выполняет различные операторы печати и ввода до завершения. После этого кода такой:

Код: Выделить всё

if __name__ == "__main__":
main()
root = tk.Tk()
app = OutputRedirectorGUI(root)
root.mainloop()
Поскольку я новичок в этом деле, я просто действую методом проб и ошибок, следуя инструкциям.

Вернуться в «Python»