我有3个scrolledtext Tkinter小部件,我想独立地将文本重定向到每个小部件。
我可以使用stdout打印到func1中的第一个文本
第二个-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()
最佳答案
一条建议:删除TextDump。而是将写方法添加到ScrolledText(或更可能是其子类),并使用打印调用的file=
选项。增强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)
就
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
关于python - 将“stdout”重定向到多个scrolledtext小部件?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52823041/