使用 Tkinter 用图片填充网格单元格 Python

Fill in a cell of grid with a picture using Tkinter Python

我正在创建一个棋盘来显示我的 NQueensProblem 搜索。我制作了一个网格并用颜色填充了单元格。但是,我无法用 'queen picture' 填充皇后的位置。例如,我在 (0, 1) 有一个皇后,我希望这个单元格显示一张皇后图片。请帮我解决一下这个。 非常感谢大家!!!

    import tkinter as tk
from tkinter.tix import IMAGETEXT
from matplotlib import colors
from PIL import Image, ImageTk

class GUI(tk.Frame) :
    def __init__(self, position, no_of_queens) :
        tk.Frame.__init__(self)
        self.grid()
        self.master.title('Order Queens')

        self.main_grid = tk.Frame(self, bg = '#a39489', bd = 0, width = 50, height = 50)

        self.main_grid.grid(pady = (0, 0))

        self.display_GUI(position, no_of_queens)
        self.mainloop()

    def make_GUI(self, no_of_queens) :
        # make grid
        self.cells = []
        for i in range(no_of_queens) :
            row = []
            for j in range(no_of_queens) :
                if i % 2 == 0 :
                    if j % 2 == 0 :
                        cell_color = '#f2dbbb'
                    else :
                        cell_color = '#832c33'
                else :
                    if j % 2 == 0 :
                        cell_color = '#832c33'
                    else :
                        cell_color = '#f2dbbb'

                cell_frame = tk.Frame(self.main_grid, bg = cell_color, width = 45, height = 45)
                cell_frame.grid(row = i, column = j, padx = 0, pady = 0)
                cell_number = tk.Label(self.main_grid, bg = cell_color)
                cell_number.grid(row = i, column = j)
                cell_data = {'frame': cell_frame, 'number': cell_number}
                row.append(cell_data)

            self.cells.append(row)
        
    def display_GUI(self, position, no_of_queens) :
        self.make_GUI(no_of_queens)

        img = tk.PhotoImage(file = 'C:\Users\Admin\Downloads\queen.gif')
        for i in range(no_of_queens) :
            #label.grid
            self.cells[i][position[i]]['number'].configure(image = img)


if __name__ == '__main__':
    no_of_queens = 8
    position = (1, 2, 3, 0, 5, 7, 4, 6)
    GUI(position, no_of_queens)

bugPhotoImage 中的常见问题是在将图像分配给函数中的局部变量时删除图像。您必须使用全局变量或 class 变量。

请参阅第 PhotoImage 页末尾的 Note

(在 archive.org 上备份 link 因为原来的页面已经不存在了)


使用self.

self.img = tk.PhotoImage(file='test/face.png')

    .configure(image=self.img)