Tkinter,如何调整树视图缩进大小和指示器箭头图像

Dan*_*son 1 python tkinter

我有一个树形视图小部件,您可以放大和缩小字体大小。问题是缩进在放大时与正常时不成比例。有没有办法调整缩进宽度?下面是两张图片,一张是正常的,另一张是放大的。我也想知道是否有办法更改指示器图像?

更新:由于下面的jasonharper评论,我已经解决了缩进问题。我仍然需要更改指示箭头图像似乎无法在网络上找到任何信息。

图片1

图像2

j_4*_*321 6

缩进

正如 jasonharper 和 Daniel Huckson 在评论中所说,缩进可以用

style.configure('Treeview', indent=100)
Run Code Online (Sandbox Code Playgroud)

指示图像

可以通过创建自定义主题元素并使用它来替换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()
Run Code Online (Sandbox Code Playgroud)

截屏