代码之家  ›  专栏  ›  技术社区  ›  buhtz

Tkinter中单元格中包含图片的列表或表格的小部件

  •  1
  • buhtz  · 技术社区  · 8 年前

    我需要一个小部件,就像一个列列表。单元格的值可以是整数、字符串或 图片 .

    Tkinter自己的 Listbox 不能有列。这个 Treeview 无法将图片作为值(第一列除外 #0 ).

    有没有适合我需要的Tkinter扩展?或者我怎么能自己创造这样的东西?

    一些可作为答案基础的示例代码。

    #!/usr/bin/env python3
    
    from tkinter import *
    from tkinter import ttk
    from PIL import Image
    from PIL import ImageTk
    
    if __name__ == '__main__':
        root = Tk()
    
        # or a Listbox!!!
        tree = ttk.Treeview(root,
                            columns = ('one'))
        tree.heading('one', text='one')
        tree.pack()
    
        tree.img = Image.new(mode='RGBA', size=(10, 20), color='red')
        tree.img = ImageTk.PhotoImage(tree.img)
    
        for i in range(50):
            tree.insert(parent='',
                       index=END,
                       image=tree.img,
                       text='',
                       values = i)
    
        root.mainloop()
    
    1 回复  |  直到 4 年前
        1
  •  3
  •   Nae    6 年前

    可以使用 Label 显示整数、字符串和图像:

    try:                        # In order to be able to import tkinter for
        import tkinter as tk    # either in python 2 or in python 3
    except ImportError:
        import Tkinter as tk
    
    
    class LabelGrid(tk.Frame):
        """
        Creates a grid of labels that have their cells populated by content.
        """
        def __init__(self, master, content=([0, 0], [0, 0]), *args, **kwargs):
            tk.Frame.__init__(self, master, *args, **kwargs)
            self.content = content
            self.content_size = (len(content), len(content[0]))
            self._create_labels()
            self._display_labels()
    
    
        def _create_labels(self):
            def __put_content_in_label(row, column):
                content = self.content[row][column]
                content_type = type(content).__name__
                if content_type in ('str', 'int'):
                    self.labels[row][column]['text'] = content
                elif content_type == 'PhotoImage':
                    self.labels[row][column]['image'] = content
    
    
            self.labels = list()
            for i in range(self.content_size[0]):
                self.labels.append(list())
                for j in range(self.content_size[1]):
                    self.labels[i].append(tk.Label(self))
                    __put_content_in_label(i, j)
    
    
        def _display_labels(self):
            for i in range(self.content_size[0]):
                for j in range(self.content_size[1]):
                    self.labels[i][j].grid(row=i, column=j)
    
    
    if __name__ == '__main__':
        root = tk.Tk()
        img = tk.PhotoImage(file="13.gif") # replace with your image
        label_grid = LabelGrid(root, ([3, img], ['my_string', 7]))
        label_grid.pack()
        tk.mainloop()