Шаг 48.
Библиотека Tkinter. Компоненты и вспомогательные классы. Стилизуемые компоненты. Компонент Treeview: иерархический список (окончание)
На этом шаге мы рассмотрим методы этого компонента и прведем примеры его использования.
А теперь приступим к рассмотрению методов компонента Treeview. Их очень много:
- insert (<Идентификатор пункта-родителя>, <Номер>[, iid=<Идентификатор>], <Опции пункта>) - вставляет новый пункт в список.
Первый параметр метода указывает идентификатор пункта, который станет родителем для вставляемого пункта. Если требуется вставить пункт на самый верхний (нулевой) уровень вложенности,
первым параметром следует передать пустую строку.
Вторым параметром можно указать целочисленный номер, под который пункт будет помещен в список. Так, если указать число 0, новый пункт будет вставлен в самое начало набора пунктов - потомков заданного родителя, если задать 4 - станет пятым по счету пунктом в наборе. Чтобы добавить пункт в конец списка, следует передать вторым параметром строку "end".
В параметре iid можно задать строковый идентификатор для нового пункта. Такой идентификатор можно использовать, чтобы сослаться на нужный пункт списка. Если указать значение None,
идентификатор для вставляемого пункта будет сгенерирован автоматически и возвращен методом в качестве результата.
Остальные параметры указывают опции создаваемого пункта:
- text - задает текст, который будет выведен в служебном столбце;
- image - указывает изображение, которое будет выводиться в служебном столбце между значком разворачивания/сворачивания и заданным в опции text текстом. Изображение
должно быть представлено в виде экземпляра класса PhotoImage или ImageTk.PhotoImage из библиотеки Pillow;
- values - указывает содержимое остальных столбцов создаваемого пункта. Значение должно быть задано в виде последовательности строк, каждая из которых содержит значение для
одного из столбцов. Нужно иметь в виду, что значения в последовательности должны быть записаны в порядке, соответствующем логическому порядку столбцов (заданному опцией displaycolumns компонента);
- open - если True или 1, пункт будет изначально развернут и в списке будут представлены все его потомки, если False или 0, пункт будет свернут (поведение по умолчанию);
- tags - задает тег или набор тегов, которые будут привязаны к пункту. Эти теги могут использоваться для указания оформления пункта или привязки к нему обработчиков событий (как это сделать, мы узнаем позже).
Значение может быть указано в виде строки с тегом или последовательности строк, каждая из которых представляет один тег.
В качестве результата метод возвращает строковый идентификатор вставленного в список пункта;
- item (<Идентификатор пункта>[ option=<Haзвание опции>] [, <Опции пункта>]) - выполняет три разных действия, в зависимости от набора параметров:
- если вызван с двумя или более параметрами и без параметра option - устанавливает новые значения опций для пункта с заданным в первом параметре идентификатором:
trwPlatforms.item(iid1, values=("Python", "3.5.4"))
- если вызван с параметром option - возвращает значение опции, чье название указано в этом параметре:
vals = trwPlatforms.item(iid2, option="values")
- если вызван только с одним параметром - возвращает словарь со значениями всех опций указанного пункта:
print(trwPlatforms.item(iid))
# Результат:
# {'text': ", 'image': ", 'values': ('Ruby', '2.5.0'),
# 'open': 0, 'tags': " }
- set (<Идентификатор пункта>[, column=<Столбец>[, value=<Содержимое столбца>]]) - выполняет три разных действия, в зависимости от набора параметров:
- если вызван со всеми тремя параметрами - задает для столбца с указанным в параметре column обозначением новое содержимое, которое задает параметр value. В качестве
обозначений столбцов можно использовать их внутренние идентификаторы и строки вида "#<Физический номер столбца>":
trwPlatforms.set(iid2, column="Name", value="PHP")
- если вызван с двумя параметрами - возвращает содержимое столбца, чье обозначение указано в параметре column:
vals = trwPlatforms.set(iid2, column="Name")
- если вызван только с одним параметром - возвращает словарь с содержимым всех столбцов указанного пункта:
print(trwPlatforms.set(iid))
# Результат:
# {'Name': 'Ruby', 'Version': '2.5.0'}
- column (<Столбец>[, option=<Haзвание опции>] [, <Опции столбца>]) - выполняет три разных действия, в зависимости от набора параметров:
- heading (<Столбец>[, option=<Haзвание опции>] [, <Опции шапки столбца>]) - выполняет три разных действия, в зависимости от набора параметров:
- tag_configure (<Тег>[, option=<Haзвание опции>][, <Опции тега>]) - выполняет три разных действия, в зависимости от набора параметров:
- если вызван с двумя или более параметрами и без параметра option - устанавливает новые значения опций для указанного тега. Поддерживаются следующие опции тегов:
- font - задает шрифт текста для ячеек пункта;
- foreground - задает цвет текста для ячеек пункта;
- background - задает цвет фона для ячеек пункта;
- image - указывает изображение, которое будет выводиться в ячейках слева от текста. Должно быть указано в виде экземпляра класса PhotoImage или ImageTk.PhotoImage из библиотеки Pillow.
Пример:
trwPlatforms.tag_configure("important", foreground="red")
- если вызван с параметром option - возвращает значение опции тега, чье название указано в этом параметре:
color = trwPlatforms.tag_configure("important", option="foreground")
- если вызван только с одним параметром - возвращает словарь со значениями всех опций указанного тега;
- set_children (<Идентификатор пункта-родителя>, <Идентификаторы пунктов-потомков>) - вкладывает в пункт, идентификатор которого указан первым параметром,
пункты, чьи идентификаторы в виде списка заданы вторым параметром. Все пункты, что ранее были вложены в пункт-родитель, удаляются;
- move (<Идентификатор перемещаемого пункта>, <Идентификатор пункта-родителя>, <Номер>) - перемещает пункт с идентификатором, заданным в первом
параметре, в пункт, чей идентификатор задан во втором параметре, делая его родителем перемещаемого пункта и располагая перемещаемый пункт по номеру из третьего параметра;
- delete (<Идентификаторы пунктов>) - полностью удаляет пункты, чьи идентификаторы указаны в качестве параметров, вместе с их потомками. Количество идентификаторов пунктов, которые можно указать в методе, не ограничено;
- detach (<Идентификаторы пунктов>) - убирает из списка пункты, чьи идентификаторы указаны в качестве параметров, вместе с их потомками. Количество идентификаторов пунктов, которые можно указать в методе, не ограничено.
Убранные пункты можно вновь поместить в список, воспользовавшись методом move();
- focus ([<Идентификатор пункта>]) - делает пункт с указанным идентификатором выбранным. Если вызван без параметра, возвращает идентификатор выбранного в настоящий момент пункта списка или пустую строку, если ни один пункт не выбран;
- selection () - возвращает кортеж, содержащий идентификаторы выбранных в настоящий момент пунктов списка;
- selection_set (<Идентификаторы пунктов>) - делает выбранными пункты списка с заданными идентификаторами. В качестве значения параметра можно указать как последовательность идентификаторов, так и единичный идентификатор;
- selection_add (<Идентификаторы пунктов>) - в дополнение к уже выбранным пунктам списка делает выбранными пункты с заданными идентификаторами. В качестве значения параметра можно указать как последовательность идентификаторов, так и единичный идентификатор;
- selection_remove (<Идентификаторы пунктов>) - убирает пункты с заданными идентификаторами из числа выбранных в списке. В качестве значения параметра можно указать как последовательность идентификаторов, так и единичный идентификатор;
- selection_toggle (<Идентификаторы пунктов>) - выбранные пункты списка с заданными идентификаторами делает невыбранными, а невыбранные - выбранными. В качестве значения параметра можно указать как последовательность идентификаторов, так и единичный идентификатор;
- see (<Идентификатор пункта>) - прокручивает список таким образом, чтобы пункт с указанным идентификатором появился в поле зрения пользователя. Также, если необходимо, выполняет разворачивание всех пунктов - его родителей;
- exists (<Идентификатор пункта>) - возвращает True, если пункт с указанным идентификатором присутствует в списке (даже если он убран оттуда вызовом метода detach()), и False в противном случае;
- next (<Идентификатор пункта>) - возвращает идентификатор пункта, следующего за тем, чей идентификатор задан в параметре, и имеющего того же родителя. Если это последний пункт в наборе, возвращается пустая строка;
- prev (<Идентификатор пункта>) - возвращает идентификатор пункта, предшествующего тому, чей идентификатор задан в параметре, и имеющего того же родителя. Если это первый пункт в наборе, возвращается пустая строка;
- parent (<Идентификатор пункта>) - возвращает идентификатор пункта - родителя того, чей идентификатор задан в параметре. Если это пункт нулевого уровня вложенности, возвращается пустая строка;
- index (<Идентификатор пункта>) - возвращает порядковый номер пункта с заданным идентификатором. Нумерация пункта выполняется внутри их родителя так: первый пункт-потомок имеет номер 0, второй - 1, третий - 2 и т. д. Номер представлен в виде целого числа;
- get_children (<Идентификатор пункта>) - возвращает кортеж с идентификаторами пунктов - потомков пункта с указанным в параметре идентификатором. Если вызван без параметра, возвращает кортеж с идентификаторами пунктов нулевого уровня вложенности;
- bbox (<Идентификатор пункта>[, column=<Столбец>]) - если пункт с указанным в первом параметре идентификатором видим, возвращает кортеж из четырех значений: горизонтальной и вертикальной координат левого верхнего угла воображаемого прямоугольника, охватывающего этот пункт,
его ширины и высоты. Все значения представлены в виде целых чисел и измеряются в пикселях, обе координаты указываются относительно самого списка.
Если в параметре column указать обозначение столбца, воображаемый прямоугольник включит только ячейку пункта, находящуюся в этом столбце. Если пункт с заданным идентификатором невидим (например, его родитель свернут), возвращается пустая строка;
- identify_column (<Горизонтальная координата>) - принимает горизонтальную координату, заданную в виде целого числа в пикселях и измеренную относительно самого компонента, и возвращает строковое обозначение столбца, на который приходится эта координата.
Возвращаемое обозначение имеет вид "#<Физический номер столбца>";
- identify_row (<Bepтикальная координата>) - принимает вертикальную координату, заданную в виде целого числа в пикселях и измеренную относительно самого компонента, и возвращает строковый идентификатор пункта, на который приходится эта координата.
Если координата приходится на пустую область списка, возвращается пустая строка;
- identify_region (<Горизонтальная координата>, <Bepтикальная координата>) - принимает горизонтальную и вертикальную координаты, заданные в виде целых чисел в пикселях и измеренные относительно самого компонента,
и возвращает строковое обозначение части списка, на которую пришлась точка с этими координатами. Вот строковые обозначения, возвращаемые методом:
- "heading" - шапка;
- "separator" - разделительная линия между столбцами;
- "tree" - служебный столбец;
- "cell" - ячейка любого из последующих столбцов;
- "nothing" - область компонента, не занятая указанными ранее частями;
- tag_bind (<Тег>, <Наименование события>, <Обработчик>) - привязывает обработчик к событию с заданным наименованием, возникающему в пунктах, для которых был задан указанный в первом параметре тег;
- tag_has (<Тег>[, <Идентификатор пункта>]) - будучи вызванным с двумя параметрами, возвращает True, если к пункту с заданным идентификатором был привязан указанный тег, и False в противном случае. Если метод вызван с одним параметром, он возвращает список идентификаторов пунктов, к которым был привязан заданный тег.
Компонент Treeview поддерживает три виртуальных события:
- TreeviewSeiect - возникает при изменении состава выбранных пунктов списка;
- TreeviewOpen - возникает перед разворачиванием пункта списка;
- TreeviewClose - возникает перед сворачиванием пункта списка.
Вот пример вывода иерархического списка с применением компонента Treeview (результат его выполнения показан на рисунке 1):
import tkinter
import tkinter.ttk
class Application(tkinter.ttk.Frame):
def __init__(self, master=None):
super().__init__(master)
# Обязательно указываем ширину и высоту контейнера посредством
# опций width и height соответственно
self.configure(width=200, height=100)
self.pack(padx=4, pady=4)
self.create_widgets()
self.master.title("Пример использования Treeview")
def create_widgets(self):
self.img = tkinter.PhotoImage(file="icon.gif")
trwPlatforms = tkinter.ttk.Treeview(self, columns=("Version"),
displaycolumns=(0,), show="tree")
root = trwPlatforms.insert("", "end",
None, text="Python", image=self.img, values=("3.6.4",), open=True)
trwPlatforms.insert(root, "end", None,
text="Pillow", image=self.img, values=("1.1.7",))
trwPlatforms.insert(root, "end", None,
text="Django", image=self.img, values=("1.9.2",))
trwPlatforms.insert(root, "end", None,
text="MySQLClient", image=self.img, values=("1.3.12",))
root = trwPlatforms.insert("", "end",
None, text="PHP", image=self.img, values=("7.2.1",))
trwPlatforms.insert(root, "end", None,
text="Laravel", image=self.img, values=("5.3.29",))
trwPlatforms.column("Version", width=50, stretch=False, anchor="center")
trwPlatforms.grid()
root = tkinter.Tk()
app = Application(master=root)
root.mainloop()
Архив с файлами можно взять
здесь.
Рис.1. Компонент Treeview, отображающий иерархический список
А вот пример использования компонента Treeview для вывода обычного списка, представленного в виде таблицы (рисунок 2):
import tkinter
import tkinter.ttk
class Application(tkinter.ttk.Frame):
def __init__(self, master=None):
super().__init__(master)
# Обязательно указываем ширину и высоту контейнера посредством
# опций width и height соответственно
self.configure(width=200, height=100)
self.pack(padx=4, pady=4)
self.create_widgets()
self.master.title("Пример использования Treeview")
def create_widgets(self):
trwPlatforms = tkinter.ttk.Treeview(self, columns=("Name", "Version"),
displaycolumns=(0, 1), show="headings")
trwPlatforms.insert("", "end", None, values=("Python", "3.6.4"))
trwPlatforms.insert("", "end", None, values=("PHP", "7.2.1"))
trwPlatforms.insert("", "end", None, values=("Ruby", "2.5.0"))
trwPlatforms.column("Version", width=50, stretch=False, anchor="center")
trwPlatforms.heading("Name", text="Платформа")
trwPlatforms.heading("Version", text="Версия", anchor="center")
trwPlatforms.grid()
root = tkinter.Tk()
app = Application(master=root)
root.mainloop()
Архив с файлом можно взять
здесь.
Рис.2. Компонент Treeview, отображающий обычную таблицу
На следующем шаге мы рассмотрим виджет Scrollbar.
Предыдущий шаг
Содержание
Следующий шаг