Перенаправить «stdout» на несколько виджетов с прокруткой текста? - PullRequest
0 голосов
/ 15 октября 2018

У меня есть 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()

1 Ответ

0 голосов
/ 16 октября 2018

Одно предложение: удалить 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
...