关于ttk.treeview item中图文间距

问题描述

在 tkinter 树视图中,我将图像添加到每一行,但图像和文本之间没有空格。
这是一个工作示例的代码


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


class App(ttk.Frame):

    def __init__(self,parent,*args,**kwargs):
        ttk.Frame.__init__(self,parent)
        self.parent = parent

        # Create Treeview
        self.tree = ttk.Treeview(self.parent,selectmode='browse')
        ttk.Style().configure("Treeview",rowheight=21)
        self.tree.pack(expand=True,fill='both',side='left')
        # Setup column heading
        self.tree.heading('#0',text='Items',anchor='center')
        # Setup columns
        self.tree.column('#0',minwidth=100,width=200,stretch=False)

        image = Image.new('RGB',(24,18),'cyan')
        self.cyan = ImageTk.PhotoImage(image)
        image = Image.new('RGB','orange')
        self.orange = ImageTk.PhotoImage(image)
        image = Image.new('RGB','yellow')
        self.yellow = ImageTk.PhotoImage(image)
        image = Image.new('RGB','red')
        self.red = ImageTk.PhotoImage(image)
        image = Image.new('RGB','green')
        self.green = ImageTk.PhotoImage(image)
        image = Image.new('RGB','purple')
        self.purple = ImageTk.PhotoImage(image)

        self.tree.insert('','0',text="Cyan",image=self.cyan)
        self.tree.insert('','1',text="Orange",image=self.orange)
        self.tree.insert('','2',text="Green",image=self.green)
        self.tree.insert('','3',text="Purple",image=self.purple)
        self.tree.insert('','4',text="Red",image=self.red)
        self.tree.insert('','5',text="Yellow",image=self.yellow)


if __name__ == '__main__':
    root = tk.Tk()
    root.geometry('400x175+200+100')
    App(root)
    root.mainloop()

使用此代码,我得到以下窗口:

enter image description here

我希望在每一行的文本之前有更多的空间。
这似乎与我在任何软件中看到的不同。

当然有一个简单的解决方法:只需在文本的开头添加几个空格,但这似乎不是一个很好的解决方案,因为一旦开始处理它就更有可能出错文本(检索或更改)来自不同的方法
另一种方法是在图片后面加上一个稍微宽一点的透明层,但这也不是很好,因为它非常精细(实际上我不确定这是否可行)而且我在一个中使用了相同的图片空间可以的不同上下文,所以我必须复制图像。

我想一定有更聪明的方法,但我找不到。 有人知道吗?

解决方法

您可以使用透明图像并粘贴您的图像,例如:

def image_pad(color,x,y,padx=5):
    image = Image.new('RGBA',(x + padx,y))
    image.paste(Image.new('RGB',(x,y),color))
    return ImageTk.PhotoImage(image)

(我在window下测试过)