Рецептик не мой, но несколько модифицированный под собственные нужды.
Оригинала не осталось.
Представляет из себя топлевел окно с текстом, который можно динамически добавлять.
import Tkinter as tk
class ScrolledText(tk.Frame):
def __init__(self, parent=None, text='', file=None):
self.window = tk.Toplevel()
self.window.title('Лог событий')
self.window.protocol('WM_DELETE_WINDOW', self.window.withdraw)
# if parent:
# self.window.transient(parent)
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='', 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)
for str in strings:
self.text.insert(tk.END, str)
self.text.insert(tk.END, ' ')
self.text.insert(tk.END, '\n')
self.window.update_idletasks()
self.text.focus()
def gettext(self,from_pos='1.0'):
return self.text.get(from_pos, tk.END+'-1c')
Использование:
Объявявление:
log = ScrolledText(parent=root)Добавление текста:
log.write(thread.id,': Downoading ‘,self.url.split(’/'))Перезапись текста:
log.set( <строка или имя файла для вывода в это окно> )Для добавления текста можно передать кортеж аргументов, как для оператора
print.
Для перезаписи - только строку.
Внимание, виснет если текстовое окно переполняется. Если кто знает как решить эту проблему, был бы благодарен. Так же как его автоматически прокручивать (как окно чата).
Пока только одна идея - при достижении максимально влезающего количества строк вызывается
gettext от второй строки до конца затем
set этого и
write новой строки на освободившееся место.