首页 > 解决方案 > 使用 python 3 和 tkinter 在树视图字段中添加多个图标

问题描述

我知道如何使用tags关键字在 #0 列中添加图标:

icon = ImageTk.PhotoImage(Image.open('path/to/icon.gif')
myTreeView.tag_configure('tag_with_this_icon', image=icon)

# some loop
myTreeView.insert( [...],tags='tag_with_this_icon')

我需要添加一个额外的图标,或者在树视图的任何其他列中添加一个图标,tkinter 可以吗?

还是我需要在同一个图标文件中使用两个图标调整我的图标 gif 文件(所有可能的排列)

或者在第一个树视图的左侧用一列/空文本 jsu 为第二个图标添加另一个树视图?似乎是一个糟糕的黑客...任何更好的想法表示赞赏,谢谢。

标签: python-3.xtkintertreeviewicons

解决方案


一种方法是使用GTK3而不是 tkinter,下面是一个有效的示例。OP 要求使用 tkinter 的解决方案,但 OP 是我,并没有找到它的方式,所以......

from gi.repository import Gtk, Gdk, GdkPixbuf

class MyWindow(Gtk.Window):
    def __init__(self):
        Gtk.Window.__init__(self)
        self.set_default_size(200, 200)

        self.liststore = Gtk.ListStore(str, str, str)
        self.treeview = Gtk.TreeView(model=self.liststore)

        self.liststore.append(["dot_red16x16.png", "This is a symbol1","dot_green16x16.png"])

        px_renderer = Gtk.CellRendererPixbuf()
        px_column = Gtk.TreeViewColumn('')
        px_column.pack_start(px_renderer, False)

        str_renderer = Gtk.CellRendererText()
        px_column.pack_start(str_renderer, False)

        px_renderer2 = Gtk.CellRendererPixbuf()
        px_column.pack_start(px_renderer2, False)

        # set data connector function/method
        px_column.set_cell_data_func(px_renderer, self.get_tree_cell_pixbuf,0)
        px_column.set_cell_data_func(px_renderer2, self.get_tree_cell_pixbuf,2)
        px_column.set_cell_data_func(str_renderer, self.get_tree_cell_text)
        self.treeview.append_column(px_column)

        self.add(self.treeview)

    def get_tree_cell_text(self, col, cell, model, iter, user_data):
        cell.set_property('text', model.get_value(iter, 1))

    def get_tree_cell_pixbuf(self, col, cell, model, iter, user_data):
        cell.set_property('pixbuf', GdkPixbuf.Pixbuf.new_from_file(model.get_value(iter, user_data)))

if __name__ == '__main__':
    win = MyWindow()
    win.connect("delete-event", Gtk.main_quit)
    win.show_all()
    Gtk.main()

第 11 行,用您自己的图标文件替换dot_red16x16.pngdot_green16x16.png命名,并将此剪断的图标文件保存在一边。

gtk 阅读文档:https ://python-gtk-3-tutorial.readthedocs.io

旁注: 实际上(在 Windows 上)更难的是设置 GTK3 工作。这是我测试的两种方法:


推荐阅读