Найти - Пользователи
Полная версия: Вопрос по библиотеке tkinter виджету text
Начало » Python для новичков » Вопрос по библиотеке tkinter виджету text
1
Atkin
Собственно, вопрос глупый, но застопорило и дойти сам не могу. Прошу у вас помощи:
Есть в главном окне два фрейма. На одном расположена кнопка, на другом поле текста (text).
Нужно, чтобы при нажатии кнопки в поле text добавлялась строка с нужным текстом
Заранее благодарю
Eliont
Рецептик не мой, но несколько модифицированный под собственные нужды.
Оригинала не осталось.
Представляет из себя топлевел окно с текстом, который можно динамически добавлять.

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 новой строки на освободившееся место.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB