У меня есть 3 виджета с прокруткой Tkinter и я хочу перенаправить текст каждому из них независимо.
Первый текст из func1 Я могу печатать в текстовое поле, используя stdout second - 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=
option для вызовов печати. Расширение 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
func1
,func2
иfunc3
непосредственно в соответствующий виджет?