首页 > 解决方案 > 将“stdout”重定向到多个滚动文本小部件?

问题描述

我有 3 个滚动文本 Tkinter 小部件,我想将文本独立地重定向到每个小部件。

来自func1的第一个文本我可以使用stdout 第二个打印到文本框 - func2使用stderr但是如何打印多个文本框,因为如果我将stdout用于所有这三个函数,它将把这3个函数打印到第三个仅限文本框,并且会跳过 txt1 和 txt2 的代表,但我想让每个文本框的输出独立。

看一下示例代码:这里有 3 个文本框、3 个按钮和 3 个打印一些文本的函数,每个按钮应该只将文本打印到相应的文本框。

在当前的方式中,它会将文本从 func1 打印到 txt1,从 func2 到 txt2,然后从 func3 再次打印到 txt2,但它应该将其打印到 txt3。

class app_app(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)

        self.txt1 = scrolledtext.ScrolledText(self)
        self.txt1.place()

        self.txt2 = scrolledtext.ScrolledText(self)
        self.txt2.place()

        self.txt3 = scrolledtext.ScrolledText(self)
        self.txt3.place()

        b = tk.Button(self, text="run", command=self.func1)
        b.place()
        b1 = tk.Button(self, text="run", command=self.func2)
        b1.place()
        b2 = tk.Button(self, text="run", command=self.func3)
        b2.place() 

       sys.stdout = TextDump(self.txt1, "stdout")
       sys.stderr = TextDump(self.txt2, "stderr")
       sys.stderr = TextDump(self.txt3, "stderr")

   def func1(self):
       print("func1 print")

   def func2(self):
       print("func2 print")

   def func3(self):
       print("func3 print") 


class TextDump(object):
     def __init__(self, widget, tag="stdout"):
         self.widget = widget
         self.tag = tag

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

     def flush(self):
         pass
app = app_app()
app.mainloop()

标签: pythonpython-3.xtkinterstdout

解决方案


一个建议:删除TextDump。相反,将 write 方法添加到 ScrolledText(或者,可能更好,它的子类)并使用file=print 调用选项。增加 ScrolledText 并忽略标记:

# Before app_app.
def write(self, text):
    self.insert("end", text)
ScrolledText.write = write

    # Within app_app, replace current func1/2/3 defs.
    def func1(self):
        print("func1 print", file=self.txt1)

出于 .write 的目的print,文件是具有 .write 方法的对象。

>>> class Writable:
    def write(self, string): print(self, string)

>>> print('hello', file=Writable())
<__main__.Writable object at 0x000002518B289F60> hello
<__main__.Writable object at 0x000002518B289F60>      # \n

推荐阅读