关于ttk.treeview项中图文之间的space
About the space between image and text in ttk.treeview item
在 tkinter 树视图中,我向每一行添加图像,但图像和文本之间没有 space。
这是一个工作示例的代码:
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', (24, 18), 'orange')
self.orange = ImageTk.PhotoImage(image)
image = Image.new('RGB', (24, 18), 'yellow')
self.yellow = ImageTk.PhotoImage(image)
image = Image.new('RGB', (24, 18), 'red')
self.red = ImageTk.PhotoImage(image)
image = Image.new('RGB', (24, 18), 'green')
self.green = ImageTk.PhotoImage(image)
image = Image.new('RGB', (24, 18), 'purple')
self.purple = ImageTk.PhotoImage(image)
self.tree.insert('', '0', '0', text="Cyan", image=self.cyan)
self.tree.insert('', '1', '1', text="Orange", image=self.orange)
self.tree.insert('', '2', '2', text="Green", image=self.green)
self.tree.insert('', '3', '3', text="Purple", image=self.purple)
self.tree.insert('', '4', '4', text="Red", image=self.red)
self.tree.insert('', '5', '5', text="Yellow", image=self.yellow)
if __name__ == '__main__':
root = tk.Tk()
root.geometry('400x175+200+100')
App(root)
root.mainloop()
使用此代码,我得到以下内容 window:
我想在每行的文本前添加更多 space。
这似乎与我在任何软件中看到的都不一样。
当然有一个简单的解决方法:在文本的开头添加几个 spaces ,但这似乎不是一个很好的解决方案,因为它更容易出错一旦开始使用不同的方法处理该文本(检索或更改它)。
另一种方法是在图片后面加一个稍微宽一点的透明层来框住图片,但这也不太好,因为它非常精致(实际上我不确定这是否可行)而且我在space 没问题的不同上下文,所以我必须复制图像。
我想一定有更聪明的方法,但我找不到。
有人知道吗?
您可以使用透明图片并粘贴您的图片,例如:
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下测试过)
在 tkinter 树视图中,我向每一行添加图像,但图像和文本之间没有 space。
这是一个工作示例的代码:
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', (24, 18), 'orange')
self.orange = ImageTk.PhotoImage(image)
image = Image.new('RGB', (24, 18), 'yellow')
self.yellow = ImageTk.PhotoImage(image)
image = Image.new('RGB', (24, 18), 'red')
self.red = ImageTk.PhotoImage(image)
image = Image.new('RGB', (24, 18), 'green')
self.green = ImageTk.PhotoImage(image)
image = Image.new('RGB', (24, 18), 'purple')
self.purple = ImageTk.PhotoImage(image)
self.tree.insert('', '0', '0', text="Cyan", image=self.cyan)
self.tree.insert('', '1', '1', text="Orange", image=self.orange)
self.tree.insert('', '2', '2', text="Green", image=self.green)
self.tree.insert('', '3', '3', text="Purple", image=self.purple)
self.tree.insert('', '4', '4', text="Red", image=self.red)
self.tree.insert('', '5', '5', text="Yellow", image=self.yellow)
if __name__ == '__main__':
root = tk.Tk()
root.geometry('400x175+200+100')
App(root)
root.mainloop()
使用此代码,我得到以下内容 window:
我想在每行的文本前添加更多 space。
这似乎与我在任何软件中看到的都不一样。
当然有一个简单的解决方法:在文本的开头添加几个 spaces ,但这似乎不是一个很好的解决方案,因为它更容易出错一旦开始使用不同的方法处理该文本(检索或更改它)。
另一种方法是在图片后面加一个稍微宽一点的透明层来框住图片,但这也不太好,因为它非常精致(实际上我不确定这是否可行)而且我在space 没问题的不同上下文,所以我必须复制图像。
我想一定有更聪明的方法,但我找不到。 有人知道吗?
您可以使用透明图片并粘贴您的图片,例如:
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下测试过)