wxpython 树控件图像
好的,这里有一个例子:
可运行的例子
把压缩包解压出来,然后运行,不然是没法工作的。
不过,当你运行的时候,图片不会被添加到树形控件里,结果会出错。
代码(注意:没有图片的话是无法运行的,见上面的压缩包)
import wx
class TestFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, -1)
self.tree = wx.TreeCtrl(self, style = wx.TR_HIDE_ROOT)
self.root = self.tree.AddRoot("")
gr = self.tree.AppendItem(self.root, "Grooveshark")
pop_r = self.tree.AppendItem(gr, "Popular")
sr = self.tree.AppendItem(gr, "Search")
dr = self.tree.AppendItem(self.root, "Download")
pr = self.tree.AppendItem(self.root, "Pandora")
stat_r = self.tree.AppendItem(pr, "Stations")
image_list = wx.ImageList(16, 16)
grooveshark = image_list.Add(wx.Image("images/grooveshark (Custom).png", wx.BITMAP_TYPE_PNG).ConvertToBitmap())
popular = image_list.Add(wx.Image("images/popular (Custom).png", wx.BITMAP_TYPE_PNG).ConvertToBitmap())
search = image_list.Add(wx.Image("images/search (Custom).png", wx.BITMAP_TYPE_PNG).ConvertToBitmap())
download = image_list.Add(wx.Image("images/download (Custom).png", wx.BITMAP_TYPE_PNG).ConvertToBitmap())
pandora = image_list.Add(wx.Image("images/playlist_icon (Custom).png", wx.BITMAP_TYPE_PNG).ConvertToBitmap())
stations = image_list.Add(wx.Image("images/stations (Custom).png", wx.BITMAP_TYPE_PNG).ConvertToBitmap())
self.tree.SetPyData(gr, None)
self.tree.SetItemImage(gr, grooveshark, wx.TreeItemIcon_Normal)
self.tree.SetPyData(pop_r, None)
self.tree.SetItemImage(pop_r, popular, wx.TreeItemIcon_Normal)
self.tree.SetPyData(sr, None)
self.tree.SetItemImage(sr, search, wx.TreeItemIcon_Normal)
self.tree.SetPyData(dr, None)
self.tree.SetItemImage(dr, download, wx.TreeItemIcon_Normal)
self.tree.SetPyData(pr, None)
self.tree.SetItemImage(pr, pandora, wx.TreeItemIcon_Normal)
self.tree.SetPyData(stat_r, None)
self.tree.SetItemImage(stat_r, stations, wx.TreeItemIcon_Normal)
if __name__ == "__main__":
a = wx.App(False)
f = TestFrame()
f.Show()
a.MainLoop()
为什么会这样呢?
我按照wxPython演示应用里的示例做的,但还是没成功。
1 个回答
2
你的代码有两个问题。
并不是所有的图片都是16像素 x 16像素,但你却想把它们添加到一个只应该包含16 x 16图片的列表中。要解决这个问题,你需要在添加到列表之前,把这些图片缩放到16 x 16的大小。
在给树形结构的每个项目应用图片之前,你应该先把图片列表分配给树形对象。
下面是修正后的代码:
import wx
class TestFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, -1)
self.tree = wx.TreeCtrl(self, style = wx.TR_HIDE_ROOT)
self.root = self.tree.AddRoot("")
gr = self.tree.AppendItem(self.root, "Grooveshark")
pop_r = self.tree.AppendItem(gr, "Popular")
sr = self.tree.AppendItem(gr, "Search")
dr = self.tree.AppendItem(self.root, "Download")
pr = self.tree.AppendItem(self.root, "Pandora")
stat_r = self.tree.AppendItem(pr, "Stations")
image_list = wx.ImageList(16, 16)
grooveshark = image_list.Add(wx.Image("images/grooveshark (Custom).png", wx.BITMAP_TYPE_PNG).Scale(16,16).ConvertToBitmap())
popular = image_list.Add(wx.Image("images/popular (Custom).png", wx.BITMAP_TYPE_PNG).Scale(16,16).ConvertToBitmap())
search = image_list.Add(wx.Image("images/search (Custom).png", wx.BITMAP_TYPE_PNG).Scale(16,16).ConvertToBitmap())
download = image_list.Add(wx.Image("images/download (Custom).png", wx.BITMAP_TYPE_PNG).Scale(16,16).ConvertToBitmap())
pandora = image_list.Add(wx.Image("images/playlist_icon (Custom).png", wx.BITMAP_TYPE_PNG).Scale(16,16).ConvertToBitmap())
stations = image_list.Add(wx.Image("images/stations (Custom).png", wx.BITMAP_TYPE_PNG).Scale(16,16).ConvertToBitmap())
self.tree.AssignImageList(image_list)
self.tree.SetPyData(gr, None)
self.tree.SetItemImage(gr, grooveshark, wx.TreeItemIcon_Normal)
self.tree.SetPyData(pop_r, None)
self.tree.SetItemImage(pop_r, popular, wx.TreeItemIcon_Normal)
self.tree.SetPyData(sr, None)
self.tree.SetItemImage(sr, search, wx.TreeItemIcon_Normal)
self.tree.SetPyData(dr, None)
self.tree.SetItemImage(dr, download, wx.TreeItemIcon_Normal)
self.tree.SetPyData(pr, None)
self.tree.SetItemImage(pr, pandora, wx.TreeItemIcon_Normal)
self.tree.SetPyData(stat_r, None)
self.tree.SetItemImage(stat_r, stations, wx.TreeItemIcon_Normal)
if __name__ == "__main__":
a = wx.App(False)
f = TestFrame()
f.Show()
a.MainLoop()