Tkinter, как настроить размер отступа в виде дерева и изображение стрелки индикатора - PullRequest
0 голосов
/ 18 апреля 2020

У меня есть виджет в виде дерева, который можно увеличивать и уменьшать размер шрифта. Проблема в том, что отступ не пропорционален при увеличении, когда это нормально. Есть ли способ отрегулировать ширину отступа? Ниже приведены два изображения: одно нормальное, другое увеличено. Мне также интересно, есть ли способ изменить изображение индикатора?

ОБНОВЛЕНИЕ: Я решил проблему с отступами благодаря jasonharper комментариям ниже. Мне по-прежнему нужно изменить индикатор, стрелка не может найти информацию в Интернете.

image1

image2

1 Ответ

3 голосов
/ 20 апреля 2020

Отступ

Как сказано в комментариях Джейсона Харпера и Дэниела Хаксона, отступ можно изменить с помощью

style.configure('Treeview', indent=100)

Изображение индикатора

Изображение индикатора можно изменить, создав собственный элемент темы и используя его вместо стандартного индикатора в макете Treeview.Item.

Ключевым моментом здесь является знать имена состояний открытого элемента ('user1') и элемента без дочерних элементов ('user2'), закрытое является состоянием по умолчанию. Поэтому индикатор открытия должен быть сопоставлен с элементами в состоянии ('user1', '!user2'), а пустое изображение - с элементами в состоянии ('user2', ).

Я использовал PIL для создания фиктивных изображений для индикатора, но можно напрямую вместо этого загрузите пользовательские изображения.

from PIL import Image, ImageTk, ImageDraw
import tkinter as tk
from tkinter import ttk

root = tk.Tk()

style = ttk.Style(root)

# custom indicator images
im_open = Image.new('RGBA', (15, 15), '#00000000')
im_empty = Image.new('RGBA', (15, 15), '#00000000')
draw = ImageDraw.Draw(im_open)
draw.polygon([(0, 4), (14, 4), (7, 11)], fill='yellow', outline='black')
im_close= im_open.rotate(90)

img_open = ImageTk.PhotoImage(im_open, name='img_open', master=root)
img_close = ImageTk.PhotoImage(im_close, name='img_close', master=root)
img_empty = ImageTk.PhotoImage(im_empty, name='img_empty', master=root)

# custom indicator
style.element_create('Treeitem.myindicator',
                     'image', 'img_close', ('user1', '!user2', 'img_open'), ('user2', 'img_empty'),
                     sticky='w', width=15)
# replace Treeitem.indicator by custom one
style.layout('Treeview.Item',
[('Treeitem.padding',
  {'sticky': 'nswe',
   'children': [('Treeitem.myindicator', {'side': 'left', 'sticky': ''}),
    ('Treeitem.image', {'side': 'left', 'sticky': ''}),
    ('Treeitem.focus',
     {'side': 'left',
      'sticky': '',
      'children': [('Treeitem.text', {'side': 'left', 'sticky': ''})]})]})]
)


tree = ttk.Treeview(root)
tree.pack()
tree.insert('', 'end', text='item 1', open=True)
tree.insert('', 'end', text='item 2')
tree.insert('I001', 'end', text='item 11', open=False)
tree.insert('I001', 'end', text='item 12', open=False)
tree.insert('I004', 'end', text='item 121', open=False)

root.mainloop()

screenshot

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...