<p>我使用了<a href="https://stackoverflow.com/a/61324709/6929343">accepted answer</a>并调整了代码。通过使用treeview行高度作为参数自动计算多边形坐标,它会稍微短一点,并且更加健壮</p>
<pre><code> ''' Create images for open, close and empty '''
width = row_height-7
im_open, im_close, im_empty = triangle_raw_images(width,
'black', 'LightGrey')
img_open = ImageTk.PhotoImage(im_open)
img_close = ImageTk.PhotoImage(im_close)
img_empty = ImageTk.PhotoImage(im_empty)
# custom indicator
style.element_create('Treeitem.myindicator', 'image', img_close,
('user1', '!user2', img_open), ('user2', img_empty),
sticky='w', width=width)
# 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': ''})]
})
]
})])
</code></pre>
<p>与接受答案相比,上述变更:</p>
<ul>
<li><code>row_height</code>是传递给treeview的同一个变量,当使用较大的字体大小时,HiDPI屏幕需要该变量</李>
<li>使用变量名代替指向变量的指针,使某些行变短。例如,使用<code>ImageTk.PhotoImage(im_open)</code>代替<code>ImageTk.PhotoImage(im_open, name='img_open', master=root)</code></li>
<li>换行应符合PEP标准79字符行长</li>
<li>缩进结束括号以使代码更具可读性</李>
</ul>
<p>变化的核心是一项新功能:</p>
<pre><code>def triangle_raw_images(hgt, outc, fillc):
from PIL import Image, ImageTk, ImageDraw # Pillow image processing
# For comments in code assume passed hgt = 21
wid = hgt # square image
hgt_off = 4 # top & bottom whitespace
wxy = ( 0, hgt_off, ) # west point x=0, y=4
exy = ( wid-1, hgt_off, ) # east point x=20, y=4
sxy = ( int((hgt-1)/2), hgt-hgt_off, ) # south point x=10, y=17
retn_images = [] # list of three images
# custom indicator images
im_open = Image.new('RGBA', (wid, hgt), (0, 0, 0, 0))
im_empty = Image.new('RGBA', (wid, hgt), (0, 0, 0, 0))
draw = ImageDraw.Draw(im_open)
draw.polygon([ wxy, exy, sxy ], outline=outc, fill=fillc)
im_close= im_open.rotate(90)
return im_open, im_close, im_empty
</code></pre>
<p>以下是最终结果:</p>
<p><a href="https://i.stack.imgur.com/TGQps.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/TGQps.png" alt="mserve open close triangles.png"/></a></p>