холст python создать изображение в цикле - PullRequest
0 голосов
/ 20 сентября 2018

Здравствуйте, я недавно начал изучать tkinter и решил выбрать шахматную настольную игру.
Ниже мой код:

import tkinter as tk

class GameBoard(tk.Frame):
    def __init__(self, parent, rows=8, columns=8, size=70, color1="white", color2="blue"):
        '''size is the size of a square, in pixels'''

        self.rows = rows
        self.columns = columns
        self.size = size
        self.color1 = color1
        self.color2 = color2
        self.pieces = {}

        canvas_width = columns * size
        canvas_height = rows * size

        tk.Frame.__init__(self, parent)
        self.canvas = tk.Canvas(self, borderwidth=0, highlightthickness=0,
                                width=canvas_width, height=canvas_height, background="bisque")
        self.canvas.pack(side="top", fill="both", expand=True, padx=2, pady=2)

root = tk.Tk()
board = GameBoard(root)
board.pack(side="top", fill="both", expand="true", padx=4, pady=4)

black_rook_l = tk.PhotoImage(file=black_rook_img)
black_rook_l = black_rook_l.subsample(2, 2)
board.addpiece("black_rook_l", black_rook_l, 0,0)

выше кода я должен добавить фигуру (черная ладья) к доске,который работает, как ожидалось.
ниже приведены вспомогательные функции:

def addpiece(self, name, image, row=0, column=0):
    '''Add a piece to the playing board'''
    self.canvas.create_image(0,0, image=image, tags=(name, "piece"), anchor="c")
    self.placepiece(name, row, column)

def placepiece(self, name, row, column):
    '''Place a piece at the given row/column'''
    self.pieces[name] = (row, column)
    x0 = (column * self.size) + int(self.size/2)
    y0 = (row * self.size) + int(self.size/2)
    # print(name, x0, y0)
    self.canvas.coords(name, x0, y0)

Но проблема возникает, когда я пытаюсь расставить пешки с помощью цикла for.Ниже приведен код:

for i in range(8):
    bname = tk.PhotoImage(file=black_pawn_img)
    bname = bname.subsample(2, 2)
    board.addpiece("black_pawn_"+str(i), bname, 1,i)

root.mainloop()

он размещает только последний кусок пешки.

Пожалуйста, предложите / помогите мне разобраться в проблеме.
Заранее спасибо.

1 Ответ

0 голосов
/ 20 сентября 2018

Объекты изображений Python уничтожаются сборщиком мусора.Вам необходимо сохранить ссылки на изображения.При первом цикле bname содержит ссылку на первое изображение, которое было создано.На следующей итерации bname модифицируется для ссылки на второе изображение.Из-за этого первое изображение больше не имеет ссылки.

Простым способом было бы отслеживать их в блоке кода, который их создает:

images = []
for i in range(8):
    bname = tk.PhotoImage(file=black_pawn_img)
    bname = bname.subsample(2, 2)
    board.addpiece("black_pawn_"+str(i), bname, 1,i)
    images.append(bname)

Другим способом было бы addpiece сохранить их:

class GameBoard(...):
    def __init__(...):
        ...
        self.images = []
        ...
    def addpiece(self, name, image, row=0, column=0):
        ...
        self.images.append(image)
        ...
...