python - 将“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()
解决方案
一个建议:删除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
推荐阅读
- python - 减少将数据库记录转换为数据帧所需时间的方法
- gnuplot - 如何在 Gnuplot 上以 f(x,y)=0 的形式绘制特定解
- django-rest-framework - 为 DRF Field 类子添加验证器的好方法
- c - int 到字符串的转换无法正常工作
- python - Python:在没有 numpy 的情况下创建逆矩阵
- c# - NET Core - FromForm 发布的嵌套对象未作为普通列表发送到微服务
- linux - 在没有root权限且没有安装c编译器的计算集群上安装gcc
- firebase - 与任何其他字段相比,更新时间戳字段存在延迟
- azure - 服务总线 SQL 筛选器显然在 Azure Functions v3 中不起作用
- sql - 如何在 VBA MS ACCESS 上创建组和用户