Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Tkinter中单元格中包含图片的列表或表格的小部件_Python_Python 3.x_Tkinter - Fatal编程技术网

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

Python Tkinter中单元格中包含图片的列表或表格的小部件,python,python-3.x,tkinter,Python,Python 3.x,Tkinter,我需要一个小部件,就像一个列列表。单元格的值可以是整数、字符串或图片 Tkinter own列表框不能有列。Treeview无法将图片作为值(第一列#0除外) 有适合我需要的Tkinter扩展吗?或者我怎么能自己创造这样的东西 可以用作答案基础的一些示例代码 #!/usr/bin/env python3 from tkinter import * from tkinter import ttk from PIL import Image from PIL import ImageTk if

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

Tkinter own
列表框不能有列。
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()

可以使用
Label
s创建网格类来显示整数、字符串和图像:

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()

我认为您不应该只使用python-3.x,除非问题是特定于python-3的。你不必要地缩小了你的听众范围。编辑。我相信,
\u display\u labels
中的
self.labels.append(list())
太过分了,不是吗?@VadimShkaberda是的,我想是的。谢谢,我把它拿走了。