Язык программирования Python.

Виджет форматированного текста.

Для того чтобы показать работу с нетривиальным виджетом, можно взять виджет ScrolledText из одноименного модуля Python. Этот виджет аналогичен рамке с форматированным текстом и вертикальной полосой прокрутки:

From Tkinter import *

From ScrolledText import ScrolledText.

Tk = Tk()              # окно верхнего уровня.

Txt = ScrolledText(tk) # виджет текста с прокруткой.

Txt.pack()             # виджет размещается.

For x in range(1, 1024): # виджет наполняется текстовым содержимым.

Txt.insert(END, str(2L**x)+"\n").

Tk.mainloop().

Язык программирования Python.

Теперь следует рассмотреть методы и свойства виджета с форматированным текстом более подробно.

Для навигации в тексте в Tk предусмотрены специальные индексы. Индексы вроде 1.0 и END уже встречались — это начало текста (первая строка, нулевой символ) и его конец. (В Tk строки нумеруются с единицы, а символы строки — с нуля). Более полный список индексов:

•  L.C Здесь L — номер строки, а C — номер символа в строке.

•  INSERT Точка вставки.

•  CURRENT Символ, ближайший к курсору мыши.

•  END Позиция сразу за последним символом в тексте.

•  M.first, M.last Индексы начала и конца помеченного тегом M участка текста.

•  SEL_FIRST, SEL_LAST Индексы начала и конца выделенного текста.

•  M Пользователь может определять свои именованные позиции в тексте (аналогично END, INSERT или CURRENT). При редактировании текста маркеры будут сдвигаться с заданными для них правилами.

•  @x,y Символ текста, ближайший к точке с координатами x, y.

Следующий пример показывает, как снабдить форматированный текст гипертекстовыми возможностями:

From Tkinter import *

Import urllib.

Tk = Tk().

Txt = Text(tk, width=64) # поле с текстом.

Txt.grid(row=0, column=0, rowspan=2).

Addr=Text(tk, background="White", width=64, height=1) # поле адреса.

Addr.grid(row=0, column=1).

Page=Text(tk, background="White", width=64) # поле с html–кодом.

Page.grid(row=1, column=1).

Def fetch_url(event):

 click_point = "@%s,%s" % (event.x, event.y).

 trs = txt.tag_ranges("href") # список областей текста, отмеченных как href.

 url = "".

 # определяется, на какой участок пришелся щелчок мыши, и берется.

 # соответствующий ему URL.

 for i in range(0, len(trs), 2):

  if txt.compare(trs[i], "<=", click_point) and \

     txt.compare(click_point, "<=", trs[i+1]):

   url = txt.get(trs[i], trs[i+1]).

 html_doc = urllib.urlopen(url).read().

 addr.delete("1.0", END).

 addr.insert("1.0", url) # URL помещается в поле адреса.

 page.delete("1.0", END).

 page.insert("1.0", html_doc) # показывается HTML–документ.

Textfrags = ["Python main site: ", "http://www.python.org",

 "\nJython site: ", "http://www.jython.org",

 "\nThat is all!"].

For frag in textfrags:

 if frag.startswith("http:"):

  txt.insert(END, frag, "href") # URL помещается в текст с меткой href.

 else:

  txt.insert(END, frag) # фрагмент помещается в текст.

# ссылки отмечаются подчеркиванием и синим цветом.

Txt.tag_config("href", foreground="Blue", underline=1).

# при щелчке мыши на тексте, отмеченном как "href",

# следует вызывать fetch_url().

Txt.tag_bind("href", "<1>", fetch_url).

Tk.mainloop() # запускается цикл событий.

В результате (после нажатия на гиперссылку) можно увидеть примерно следующее:

Язык программирования Python.

Для придания некоторым участкам текста особых свойств необходимо их отметить тегом. В данном случае URL отмечается тегом href. Позднее с помощью метода tag_config() задаются свойства отображения текста, отмеченного таким тегом. Методом tag_bind() привязывается некоторое событие (щелчок мыши) с вызовом заданной функции ( fetch_url()).

В самой функции fetch_url() нужно в начале определить, на какой именно участок текста пришелся щелчок мыши. Для этого с помощью метода tag_ranges() получаются все интервалы, которые отмечены как href. Для определения конкретного URL проводятся сравнения (методом compare()) точки щелчка мышью с каждым из интервалов. Так находится интервал, на который попал щелчок, и с помощью метода get() получается текстовое значение найденного интервала. Найдя URL, его в поле записываются адреса, и получается HTML–код, соответствующий URL.

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