Полностью имитировать стандартный вывод в текстовом виджете tkinter для поддержки конечного параметра из функции печати Python - PullRequest
0 голосов
/ 17 декабря 2018

Как мне полностью имитировать sys.stdout в текстовом виджете tkinter, чтобы я мог использовать функцию print() (в основном параметр end) на полную мощность?Так что я могу использовать print("Hello World", end='\r') для печати в текстовом виджете, где, если я распечатаю что-то еще, он перезапишет ранее напечатанный текст.

class Main:
    def __init__(self):
        self.master = tk.Tk()
        self.output = tk.Text(self.master)
        self.output.pack()
        sys.stdout = self
        self.master.mainloop()

    def write(self, txt):
        self.output.insert(tk.INSERT, str(txt))
        self.output.see('end')

    def flush(self):
        # What do I do here?

Запуск

print("Hello World", end='\r')
print("Goodbye World", end='\r')

Дает следующеев текстовом виджете

Hello World

Goodbye World

Но я ожидаю, что вместо этого будет показано следующее

Goodbye World

В качестве дополнительного вопроса, как бы я (пере) определил функцию сброса stdout для работыс текстовым виджетом tkinter?

1 Ответ

0 голосов
/ 17 декабря 2018

Я исправил проблему с возвратной кареткой, обновив функцию записи следующим образом:

def write(self, txt):
    if '\r' in txt:
        self.return_carriage = True
        return
    if self.return_carriage:
        self.output.delete(tk.INSERT + " linestart", tk.INSERT + " lineend")
        self.return_carriage = False
    self.output.insert(tk.INSERT, str(txt))
    self.output.see('end')

Это решает проблему только при использовании end='\r' в функции print().Это по-прежнему не имитирует полную функциональность sys.stdout.write.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...