ScrolledText - Виджет "многострочное поле" прокручивающийся как окно чата. В ввиду того что, иногда виснет при переполнении видимого объёма добавлен режим где ограничено максимальное количество строк, при превышении которого удаляется первая строка. [[attachment:scrolledtext.jpg]] {{{#!highlight python import Tkinter as tk import time class ScrolledText(tk.Frame): def __init__(self, text='', file=None,max_line=None): self.window = tk.Toplevel() self.max = max_line self.window.title('Лог') self.window.protocol('WM_DELETE_WINDOW', self.window.withdraw) #self.window.withdraw() tk.Frame.__init__(self, self.window) self.pack(expand=tk.YES, fill=tk.BOTH) self.makewidgets() self.set(text, file) def makewidgets(self): sbar = tk.Scrollbar(self) text = tk.Text(self, relief=tk.SUNKEN,font=("Monotype Corsiva", 15, "italic")) sbar.config(command=text.yview) text.config(yscrollcommand=sbar.set) sbar.pack(side=tk.RIGHT, fill=tk.Y) text.pack(side=tk.LEFT, expand=tk.YES, fill=tk.BOTH) self.text = text def set(self, text='', del_from='1.0', file=None): if file: text = open(file, 'r').read() self.text.delete('1.0', tk.END) self.text.insert('1.0', text) self.text.mark_set(tk.INSERT, '1.0') self.text.focus() def write(*args): strings = list(args) self = strings.pop(0) msg = "" for str in strings: msg += "%s "%str msg += '\n' numlines = int(self.text.index('end-1line').split('.')[0]) if self.max and numlines >= self.max: self.text.delete(1.0, 2.0) self.text.insert(tk.END, msg) self.window.update_idletasks() self.text.focus() def gettext(self): return self.text.get('1.0','end-1c') def show(self): self.window.deiconify() def hide(self): self.window.withdraw() def geo(self,cfg):self.window.geometry(cfg) def fill(): for i in range(100): time.sleep(0.1) textbox.write('Message %d_1' % i,'Message %d_2' % i ) root.update_idletasks() if __name__ == '__main__': root = tk.Tk() tk.Button(text='Заполнить',command=fill).pack() tk.Label(root, text='Scrolled Text').pack() textbox = ScrolledText(root,max_line = 10) textbox.geo('800x250+112+400') textbox.pack() root.mainloop() }}}