Опубликован: 22.12.2005 | Доступ: свободный | Студентов: 17068 / 526 | Оценка: 4.18 / 3.71 | Длительность: 16:16:00
ISBN: 978-5-9556-0109-0
Лекция 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.

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

Зураб Муциев
Зураб Муциев

Здравствуйте друзья, коллеги.

С кем из тьюторов вы работаете? Просто возникают вопросы, и хочется чтоб обяснили на примере как это происходит, гугл не всегда дает ответа.

Постить в соц сетях, там не всегда адекват, и чаще они базарят не по делу.

Андрей Егоров
Андрей Егоров

def bin(n):

"""Цифры двоичного представления натурального числа """

if n == 0:

   return []

n, d = divmod(n, 2)

return bin(n) + [d]

print bin(69)

Что значит здесь return[] ? Возвращает список? Непонятно какой список? Откуда он? 

 

 

Ольга Горбунова
Ольга Горбунова
Россия, липецк, мбоу сш №68, 2017