tkinter.ttk.Treeview根节点icon/image没有出现
tkinter.ttk.Treeview root node icon/image does not appear
问题: 我无法让图标图像显示在 tkinter.ttk.Treeview 中的根节点旁边。下面是我使用的测试代码。它执行了 w/o 错误,但图像没有出现在根节点的左侧。我试过使用图像文件的完整路径名,但没有用。另外,我曾尝试使用 PIL.ImageTk.PhotoImage 打开图像文件,但也没有用。而是出现如下所示的错误。
问题:如何让图标图像出现在tkinter.ttk.Treeview的根节点(或任何节点)的左侧?
测试代码:
import os
import tkinter as tk
import tkinter.ttk as ttk
from PIL import Image, ImageTk
class App(ttk.Frame):
def __init__(self, master, path):
ttk.Frame.__init__(self, master)
self.tree = ttk.Treeview(self)
ysb = ttk.Scrollbar(self, orient='vertical', command=self.tree.yview)
xsb = ttk.Scrollbar(self, orient='horizontal', command=self.tree.xview)
self.tree.configure(yscroll=ysb.set, xscroll=xsb.set)
self.tree.heading('#0', text='Directory', anchor='w')
abspath = os.path.abspath(path)
i = './icon/Home-icon_16.gif'
root_pic = tk.PhotoImage(file=i)
#root_pic = ImageTk.PhotoImage(i)
root_node = self.tree.insert('', 'end', text=abspath, open=True, image=root_pic)
l1_node = self.tree.insert(root_node, 'end', text='level 1', open=True)
l2_node = self.tree.insert(l1_node, 'end', text='level 2', open=True)
l3_node = self.tree.insert(l2_node, 'end', text='level 3', open=True)
l2a_node = self.tree.insert(l1_node, 'end', text='level 2a', open=True)
l3a_node = self.tree.insert(l2a_node, 'end', text='level 3a', open=True)
self.tree.grid(row=0, column=0)
ysb.grid(row=0, column=1, sticky='ns')
xsb.grid(row=1, column=0, sticky='ew')
self.grid()
root = tk.Tk()
path_to_my_project = os.getcwd()
app = App(root, path=path_to_my_project)
app.mainloop()
使用 PIL.ImageTk.PhotoImage 的错误消息:
root_pic = ImageTk.PhotoImage(i)
File "/usr/lib/python3/dist-packages/PIL/ImageTk.py", line 108, in __init__
mode = Image.getmodebase(mode)
File "/usr/lib/python3/dist-packages/PIL/Image.py", line 296, in getmodebase
return ImageMode.getmode(mode).basemode
File "/usr/lib/python3/dist-packages/PIL/ImageMode.py", line 52, in getmode
return _modes[mode]
KeyError: './icon/Home-icon_16.gif'
首页-icon_16.gif:
应用程序: python3.5 ver3.5.1-10; python3-tk ver3.5.1-1; tk8.6 ver8.6.5-1; python3-pil.imagetk:amd64 ver3.1.2-0ubuntu1
首先尝试使用 Image.open('file_path')
创建 PIL 映像,然后再执行 Photoimage
。此外,您需要保留对 PhotoImage 的引用,否则它不会在 tkinter 中显示。
import os
import tkinter as tk
import tkinter.ttk as ttk
from PIL import Image, ImageTk
class App(ttk.Frame):
def __init__(self, master, path):
ttk.Frame.__init__(self, master)
self.tree = ttk.Treeview(self)
ysb = ttk.Scrollbar(self, orient='vertical', command=self.tree.yview)
xsb = ttk.Scrollbar(self, orient='horizontal', command=self.tree.xview)
self.tree.configure(yscroll=ysb.set, xscroll=xsb.set)
self.tree.heading('#0', text='Directory', anchor='w')
abspath = os.path.abspath(path)
i = './icon/Home-icon_16.gif'
root_pic1 = Image.open(i) # Open the image like this first
self.root_pic2 = ImageTk.PhotoImage(root_pic1) # Then with PhotoImage. NOTE: self.root_pic2 = and not root_pic2 =
root_node = self.tree.insert('', 'end', text=abspath, open=True, image=self.root_pic2)
l1_node = self.tree.insert(root_node, 'end', text='level 1', open=True)
l2_node = self.tree.insert(l1_node, 'end', text='level 2', open=True)
l3_node = self.tree.insert(l2_node, 'end', text='level 3', open=True)
l2a_node = self.tree.insert(l1_node, 'end', text='level 2a', open=True)
l3a_node = self.tree.insert(l2a_node, 'end', text='level 3a', open=True)
self.tree.grid(row=0, column=0)
ysb.grid(row=0, column=1, sticky='ns')
xsb.grid(row=1, column=0, sticky='ew')
self.grid()
root = tk.Tk()
path_to_my_project = os.getcwd()
app = App(root, path=path_to_my_project)
app.mainloop()
问题: 我无法让图标图像显示在 tkinter.ttk.Treeview 中的根节点旁边。下面是我使用的测试代码。它执行了 w/o 错误,但图像没有出现在根节点的左侧。我试过使用图像文件的完整路径名,但没有用。另外,我曾尝试使用 PIL.ImageTk.PhotoImage 打开图像文件,但也没有用。而是出现如下所示的错误。
问题:如何让图标图像出现在tkinter.ttk.Treeview的根节点(或任何节点)的左侧?
测试代码:
import os
import tkinter as tk
import tkinter.ttk as ttk
from PIL import Image, ImageTk
class App(ttk.Frame):
def __init__(self, master, path):
ttk.Frame.__init__(self, master)
self.tree = ttk.Treeview(self)
ysb = ttk.Scrollbar(self, orient='vertical', command=self.tree.yview)
xsb = ttk.Scrollbar(self, orient='horizontal', command=self.tree.xview)
self.tree.configure(yscroll=ysb.set, xscroll=xsb.set)
self.tree.heading('#0', text='Directory', anchor='w')
abspath = os.path.abspath(path)
i = './icon/Home-icon_16.gif'
root_pic = tk.PhotoImage(file=i)
#root_pic = ImageTk.PhotoImage(i)
root_node = self.tree.insert('', 'end', text=abspath, open=True, image=root_pic)
l1_node = self.tree.insert(root_node, 'end', text='level 1', open=True)
l2_node = self.tree.insert(l1_node, 'end', text='level 2', open=True)
l3_node = self.tree.insert(l2_node, 'end', text='level 3', open=True)
l2a_node = self.tree.insert(l1_node, 'end', text='level 2a', open=True)
l3a_node = self.tree.insert(l2a_node, 'end', text='level 3a', open=True)
self.tree.grid(row=0, column=0)
ysb.grid(row=0, column=1, sticky='ns')
xsb.grid(row=1, column=0, sticky='ew')
self.grid()
root = tk.Tk()
path_to_my_project = os.getcwd()
app = App(root, path=path_to_my_project)
app.mainloop()
使用 PIL.ImageTk.PhotoImage 的错误消息:
root_pic = ImageTk.PhotoImage(i)
File "/usr/lib/python3/dist-packages/PIL/ImageTk.py", line 108, in __init__
mode = Image.getmodebase(mode)
File "/usr/lib/python3/dist-packages/PIL/Image.py", line 296, in getmodebase
return ImageMode.getmode(mode).basemode
File "/usr/lib/python3/dist-packages/PIL/ImageMode.py", line 52, in getmode
return _modes[mode]
KeyError: './icon/Home-icon_16.gif'
首页-icon_16.gif:
应用程序: python3.5 ver3.5.1-10; python3-tk ver3.5.1-1; tk8.6 ver8.6.5-1; python3-pil.imagetk:amd64 ver3.1.2-0ubuntu1
首先尝试使用 Image.open('file_path')
创建 PIL 映像,然后再执行 Photoimage
。此外,您需要保留对 PhotoImage 的引用,否则它不会在 tkinter 中显示。
import os
import tkinter as tk
import tkinter.ttk as ttk
from PIL import Image, ImageTk
class App(ttk.Frame):
def __init__(self, master, path):
ttk.Frame.__init__(self, master)
self.tree = ttk.Treeview(self)
ysb = ttk.Scrollbar(self, orient='vertical', command=self.tree.yview)
xsb = ttk.Scrollbar(self, orient='horizontal', command=self.tree.xview)
self.tree.configure(yscroll=ysb.set, xscroll=xsb.set)
self.tree.heading('#0', text='Directory', anchor='w')
abspath = os.path.abspath(path)
i = './icon/Home-icon_16.gif'
root_pic1 = Image.open(i) # Open the image like this first
self.root_pic2 = ImageTk.PhotoImage(root_pic1) # Then with PhotoImage. NOTE: self.root_pic2 = and not root_pic2 =
root_node = self.tree.insert('', 'end', text=abspath, open=True, image=self.root_pic2)
l1_node = self.tree.insert(root_node, 'end', text='level 1', open=True)
l2_node = self.tree.insert(l1_node, 'end', text='level 2', open=True)
l3_node = self.tree.insert(l2_node, 'end', text='level 3', open=True)
l2a_node = self.tree.insert(l1_node, 'end', text='level 2a', open=True)
l3a_node = self.tree.insert(l2a_node, 'end', text='level 3a', open=True)
self.tree.grid(row=0, column=0)
ysb.grid(row=0, column=1, sticky='ns')
xsb.grid(row=1, column=0, sticky='ew')
self.grid()
root = tk.Tk()
path_to_my_project = os.getcwd()
app = App(root, path=path_to_my_project)
app.mainloop()