ScrolledText - Виджет "многострочное поле" прокручивающийся как окно чата. В ввиду того что, иногда виснет при переполнении видимого объёма добавлен режим где ограничено максимальное количество строк, при превышении которого удаляется первая строка.

scrolledtext.jpg

   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()

Пакеты/GUI/Tkinter/scrolledtext (последним исправлял пользователь Роман 2010-11-17 11:39:53)