如何制作python的内置打印功能,在gui上制作标签我正在制作REPL而不是打印到控制台?

问题描述

标题说明了一切,这就是我目前所拥有的(赤裸裸的开始)。我将覆盖所有 sys.std__ 函数,这样我就不必手动覆盖打印、输入等函数......我不确定如何实际放置标签,因为我不知道'没有 Gui 类所需的属性

class ModifiedPrint:
    def __init__(self):
        self.old = sys.stdout

    def write(self,text):
        sys.stdout = self.old
        print(text) # just a start
        sys.stdout = self

    def flush(self):
        self.old.flush()

sys.stdout = ModifiedPrint()

整个代码:(包括提到的 Gui 类)https://pastebin.com/9J9BiFGr

解决方法

看看这段代码:

import tkinter as tk
import sys

class GUIPrint:
    def __init__(self,text_widget:tk.Text):
        self.old_stdout = sys.stdout
        self.text = text_widget

    def write(self,data:str):
        # Insert the text in the text widget
        self.text.insert("end",data)

    def __enter__(self):
        # Enter the `with` statement
        sys.stdout = self
        return self

    def __exit__(self,*args):
        # Exit the `with` statement
        sys.stdout = self.old_stdout


def function():
    print("Hello world")

root = tk.Tk()

text_widget = tk.Text(root)
text_widget.pack()
gui_printer = GUIPrint(text_widget)

print("Normal stdout")
with gui_printer:
    print("Inside the GUI")
    function()
print("Normal stdout")

root.mainloop()

with 语句中的所有内容都打印在文本小部件中。总是保持 sys.stdout 不是一个好主意,所以我在 with 语句退出时释放它。

请注意,我使用了 tk.Text 而不是 tk.Label。这样做会容易得多。