1

正如标题所说,我有一个我重定向print()到的文本小部件。为此,我使用

class TextRedirector(object):
    def write(self, str):
        main_text.insert(1.0, str)

接着

sys.stdout = TextRedirector()

我不能做的是在插入新文本之前清除文本。为此,我添加main_text.delete(1.0, "end")如下

class TextRedirector(object):
    def write(self, str):
        main_text.delete(1.0, "end")
        main_text.insert(1.0, str)

这导致根本没有打印任何内容。

我也尝试像这样在小部件中打印文本

text = "my test is here"
class TextRedirector(object):
    def write(self, str):
        main_text.delete(1.0, "end")
        main_text.insert(1.0, text)

它工作得很好。它会清除我输入的任何内容(因为我保持状态 =“正常”)并打印我的文本。

任何帮助都感激不尽!

编辑:

这是这篇文章中的代码,您可以将其用作示例。

import tkinter as tk
import sys

class ExampleApp(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)
        toolbar = tk.Frame(self)
        toolbar.pack(side="top", fill="x")
        b1 = tk.Button(self, text="print to stdout", command=self.print_stdout)
        b1.pack(in_=toolbar, side="left")
        self.text = tk.Text(self, wrap="word")
        self.text.pack(side="top", fill="both", expand=True)
        sys.stdout = TextRedirector(self.text)

    def print_stdout(self):
        print("This is my text")

class TextRedirector(object):
    def __init__(self, widget, tag="data"):
        self.widget = widget
        self.tag = tag

    def write(self, str):
        self.widget.configure(state="normal")
        #self.widget.delete(1.0, "end")
        self.widget.insert("end", str, (self.tag,))

app = ExampleApp()
app.mainloop()

与我的代码相同,如果您从def write(self, str)函数中删除 #,它将不会打印文本。

我想要的是重定向print()到文本小部件,但每次都在一个清晰的文本框中,而不是作为一个新行。这意味着,如果我按上述代码中的 b1 按钮 4 次,我将在文本框中看到它

This is my text

而不是这个

This is my text
This is my text
This is my text
This is my text
4

1 回答 1

1

使用默认的end=\nwichistprint来设置何时删除的标志。现场演示:reply.it


import tkinter as tk
import sys, threading

class ExampleApp(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)
        toolbar = tk.Frame(self)
        toolbar.pack(side="top", fill="x")
        b1 = tk.Button(self, text="print to stdout", height=5, command=self.print_stdout)
        b1.pack(in_=toolbar, side="left")
        self.text = tk.Text(self, wrap="word")
        self.text.pack(side="top", fill="both", expand=True)

        self._count = 1
        self._stdout = sys.stdout
        sys.stdout = TextRedirector(self.text)

    def print_stdout(self):
        print("This my text {}".format(self._count))
        self._count += 1

class TextRedirector(object):
    def __init__(self, widget, tag="data"):
        self.widget = widget
        self.tag = tag
        self.eof = False

    def write(self, str):
        if self.eof:
            self.eof = False
            self.widget.delete(1.0, "end")

        if str == "\n":
            str += " thread_ident: {}".format(threading.get_ident())
            self.eof = True

        self.widget.insert("end", str, (self.tag,))


app = ExampleApp()
app.mainloop()

于 2020-05-13T19:54:06.940 回答