Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 6, 2010 20:15:45

Atkin
От:
Зарегистрирован: 2010-08-27
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопрос по библиотеке tkinter виджету text

Собственно, вопрос глупый, но застопорило и дойти сам не могу. Прошу у вас помощи:
Есть в главном окне два фрейма. На одном расположена кнопка, на другом поле текста (text).
Нужно, чтобы при нажатии кнопки в поле text добавлялась строка с нужным текстом
Заранее благодарю



Офлайн

#2 Сен. 8, 2010 11:12:54

Eliont
От:
Зарегистрирован: 2010-05-30
Сообщения: 77
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопрос по библиотеке tkinter виджету text

Рецептик не мой, но несколько модифицированный под собственные нужды.
Оригинала не осталось.
Представляет из себя топлевел окно с текстом, который можно динамически добавлять.

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 новой строки на освободившееся место.



Отредактировано (Сен. 8, 2010 11:24:17)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version