Показать значок со знаком плюс и указать отступ для дочерних элементов tkinter treeview

#python #tkinter #treeview #icons #indentation

Вопрос:

Я создаю список элементов с подпунктами, используя python 3 tkinter treeview. В моем древовидном представлении есть три столбца. Очень просто, я хочу показать этот маленький значок /- на каждом элементе, у которого есть дочерние элементы. По какой-то причине он не появляется. Кроме того, дочерние элементы отображаются непосредственно под родительскими элементами. Таким образом, без значка «плюс» и без отступа невозможно определить, какие элементы находятся под каким родителем. Это просто выглядит как список. Я не могу найти в документах, где указано «включить значок плюс» или «установить отступ дочерних элементов».

К чему я стремлюсь:

введите описание изображения здесь

Что у меня есть (это по-прежнему позволяет мне скрывать/показывать «предметы» под каждой «трубкой», дважды щелкнув строку «Трубка»):

введите описание изображения здесь

Любая помощь была бы очень признательна.

Вот несколько примеров кода:

 import tkinter as tk
import tkinter.ttk as ttk
import random


sub = tk.Toplevel()
result_frame = tk.Frame(sub)
result_frame.pack()

treeview_widget_frame = tk.Frame(result_frame)
treeview_widget_frame.pack(side = 'top')

columns = ['a','b','c']
tubes = 10

treeview_widget = ttk.Treeview(treeview_widget_frame, height = 20, columns = columns, show = 'headings')

for col in columns:
    treeview_widget.heading(col, text = col.title(), command = lambda c=col: sortby(treeview_widget, c, 0))

for n in range(int(tubes)):
    treeview_widget.insert('', tk.END, text = 'Tube '   str(n 1), iid = n, values = ('Tube '   str(n 1), "",""), open = 'True')
    print(n)

for t in range(15):
    r = random.randint(0,9)
    treeview_widget.insert(r, tk.END, values = ['Item '   str(t), '12345', 'details'])

treeview_widget.pack()
    

sub.mainloop()
 

Комментарии:

1. То есть вы имеете в виду, что текст должен динамично меняться всякий раз, когда вы нажимаете на плюс или минус?

2. Джут добавил еще немного информации, чтобы помочь прояснить ситуацию.

3. Вы даете возможность show = 'headings' при создании просмотра дерева, поэтому вы говорите tkinter скрыть часть дерева (по умолчанию show = 'tree headings' отображаются как заголовки столбцов, так и дерево).

4. Спасибо @j_4321. Это работает. Можете ли вы указать на документы, которые объясняют детали?

Ответ №1:

Как объясняется в документации tcl/tk, Treeview виджет имеет show возможность выбирать, какие части виджета отображать. Для этого требуется строка среди:

  • "tree headings" (по умолчанию)
  • "tree"
  • "headings"
  • ""

headings соответствует заголовкам столбцов и tree соответствует 0-му столбцу #0 , который содержит значки для развертывания/сворачивания элементов.

Так как вы создаете Treeview с

 treeview_widget = ttk.Treeview(..., show='headings')
 

затем вы говорите tkinter скрыть часть дерева, поэтому вы не можете видеть значки . Чтобы восстановить их, создайте дерево либо с show='tree headings' параметром, либо без него, так как это значение по умолчанию.