2024-10-02 10:19:15 发布
网友
我有一个treeview小部件,你可以放大和缩小字体大小。问题是放大时的缩进与正常时的缩进不成比例。有没有办法调整压痕宽度?下面是两张图片,一张是正常的,另一张是缩放的。我还想知道是否有办法改变指示器图像
更新: 由于下面的jasonharper注释,我已经解决了缩进问题。我仍然需要更改指示器箭头图像,但在web上似乎找不到任何信息
缩进
正如jasonharper和Daniel Huckson在评论中所说,缩进可以用
style.configure('Treeview', indent=100)
指示器图像
可以通过创建自定义主题元素并使用它替换Treeview.Item布局中的标准指示器来更改指示器图像
Treeview.Item
这里的关键是要知道打开的项(“user1”)和没有子项(“user2”)的项的状态名称,关闭是默认状态。因此,打开指示符需要与状态为('user1', '!user2')的项映射,而空映像需要与状态为('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()
我使用了accepted answer并调整了代码。通过使用treeview行高度作为参数自动计算多边形坐标,它会稍微短一点,并且更加健壮
''' 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': ''})] }) ] })])
与接受答案相比,上述变更:
row_height
ImageTk.PhotoImage(im_open)
ImageTk.PhotoImage(im_open, name='img_open', master=root)
变化的核心是一项新功能:
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
以下是最终结果:
缩进
正如jasonharper和Daniel Huckson在评论中所说,缩进可以用
指示器图像
可以通过创建自定义主题元素并使用它替换
Treeview.Item
布局中的标准指示器来更改指示器图像这里的关键是要知道打开的项(“user1”)和没有子项(“user2”)的项的状态名称,关闭是默认状态。因此,打开指示符需要与状态为
('user1', '!user2')
的项映射,而空映像需要与状态为('user2', )
的项映射我使用PIL为指示器创建虚拟图像,但可以直接加载自定义图像
我使用了accepted answer并调整了代码。通过使用treeview行高度作为参数自动计算多边形坐标,它会稍微短一点,并且更加健壮
与接受答案相比,上述变更:
row_height
是传递给treeview的同一个变量,当使用较大的字体大小时,HiDPI屏幕需要该变量李>ImageTk.PhotoImage(im_open)
代替ImageTk.PhotoImage(im_open, name='img_open', master=root)
变化的核心是一项新功能:
以下是最终结果:
相关问题 更多 >
编程相关推荐