Опубликован: 22.12.2005 | Уровень: для всех | Доступ: платный
Лекция 12:

Создание приложений с графическим интерфейсом пользователя

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

Для того чтобы показать работу с нетривиальным виджетом, можно взять виджет 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()

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

Для навигации в тексте в 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()         # запускается цикл событий

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


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

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

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

Сергей Крупко
Сергей Крупко

Добрый день.

Я сейчас прохожу курс  повышения квалификации  - "Профессиональное веб-программирование". Мне нужно получить диплом по этому курсу. Я так полагаю нужно его оплатить чтобы получить диплом о повышении квалификации. Как мне оплатить этот курс?

 

Павел Ялганов
Павел Ялганов

Скажите экзамен тоже будет ввиде теста? или там будет какое то практическое интересное задание?

Мария Кравцова
Мария Кравцова
Россия, Сочи, РГПУ им. А.И.Герцена, 1997
Екатерина Архангельская
Екатерина Архангельская
Россия, СПбГУАП