Язык программирования Python
Шрифт:
foreground=mycolor1, # fg, текст виджета
background="#0000FF», # bg, фон виджета
highlightcolor='green', # подсветка при фокусе
highlightbackground='red', # подсветка без фокуса
).pack
tv.set(«123»)
tk.mainloop
При желании можно задать стилевые опции для всех виджетов сразу: с помощью метода tk_setPalette. Помимо использованных выше свойств в этом методе можно использовать selectForeground и selectBackground (передний план и фон выделения), selectColor (цвет
Примечание:
Получить значение из поля ввода можно и при помощи метода get. Например, если назвать объект класса Entry именем e, получить значение можно так: e.get. Правда, этот метод не обладает той же гибкостью, что метод get экземпляров класса для форматированного текста Text: можно взять только все значение целиком.
Виджет форматированного текста
Для того чтобы показать работу с нетривиальным виджетом, можно взять виджет 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.