ScrolledText - Виджет "многострочное поле" прокручивающийся как окно чата. В ввиду того что, иногда виснет при переполнении видимого объёма добавлен режим где ограничено максимальное количество строк, при превышении которого удаляется первая строка.
1 import Tkinter as tk
2 import time
3
4 class ScrolledText(tk.Frame):
5
6 def __init__(self, text='', file=None,max_line=None):
7 self.window = tk.Toplevel()
8 self.max = max_line
9 self.window.title('Лог')
10 self.window.protocol('WM_DELETE_WINDOW', self.window.withdraw)
11 #self.window.withdraw()
12 tk.Frame.__init__(self, self.window)
13 self.pack(expand=tk.YES, fill=tk.BOTH)
14 self.makewidgets()
15 self.set(text, file)
16
17 def makewidgets(self):
18 sbar = tk.Scrollbar(self)
19 text = tk.Text(self, relief=tk.SUNKEN,font=("Monotype Corsiva", 15, "italic"))
20 sbar.config(command=text.yview)
21 text.config(yscrollcommand=sbar.set)
22 sbar.pack(side=tk.RIGHT, fill=tk.Y)
23 text.pack(side=tk.LEFT, expand=tk.YES, fill=tk.BOTH)
24 self.text = text
25
26 def set(self, text='', del_from='1.0', file=None):
27 if file:
28 text = open(file, 'r').read()
29 self.text.delete('1.0', tk.END)
30 self.text.insert('1.0', text)
31 self.text.mark_set(tk.INSERT, '1.0')
32 self.text.focus()
33
34 def write(*args):
35 strings = list(args)
36 self = strings.pop(0)
37
38 msg = ""
39 for str in strings: msg += "%s "%str
40 msg += '\n'
41
42 numlines = int(self.text.index('end-1line').split('.')[0])
43
44 if self.max and numlines >= self.max:
45 self.text.delete(1.0, 2.0)
46
47 self.text.insert(tk.END, msg)
48
49 self.window.update_idletasks()
50 self.text.focus()
51
52 def gettext(self):
53 return self.text.get('1.0','end-1c')
54
55 def show(self): self.window.deiconify()
56 def hide(self): self.window.withdraw()
57 def geo(self,cfg):self.window.geometry(cfg)
58
59 def fill():
60 for i in range(100):
61 time.sleep(0.1)
62 textbox.write('Message %d_1' % i,'Message %d_2' % i )
63 root.update_idletasks()
64
65 if __name__ == '__main__':
66 root = tk.Tk()
67 tk.Button(text='Заполнить',command=fill).pack()
68 tk.Label(root, text='Scrolled Text').pack()
69 textbox = ScrolledText(root,max_line = 10)
70 textbox.geo('800x250+112+400')
71 textbox.pack()
72 root.mainloop()