При очистке canvas оперативная память не освобождается

Создаю что-то похожее на paint, где есть инструмент ластик

start_paint():

    def draw_click(event):
        global img, drawer, pipi, imagelist

        if(tool_selected == "pen"):
            drawer.ellipse((event.x - 1 // 2, event.y - 1 // 2,
                             event.x + 1 // 2, event.y + 1 // 2), fill="black")

             fon_canvas.create_oval(event.x - 1,
                            event.y - 1,
                            event.x + 1,
                            event.y + 1,
                            fill="black", outline="black")

            if(tool_selected == "lastik"):
                clear_obl = None
            if(fon == "kletka"):
                clear_obl = sheet_kletka_image.crop((event.x, event.y, event.x + 50, event.y + 50))
        else:
            clear_obl = sheet_linea_image.crop((event.x, event.y, event.x + 50, event.y + 50))
        img.paste(clear_obl, (event.x, event.y))

        clobl = ImageTk.PhotoImage(clear_obl)
        fon_canvas.create_image(event.x, event.y, anchor=NW, image=clobl)
        imagelist.append(clobl)


    def draw_stop(event):
        global points, img, drawer, pipi, undo_redo_list

        points = []


    def draw(event):
        global points
        global img, drawer, pipi, select_mode

        if(tool_selected == "pen"):
            points.append((event.x - 1, event.y - 1))
            if len(points) > 2:
                drawer.line(points[-3:], fill="black", width=1)
                fon_canvas.create_line(points[-3:], fill="black", width=1)

        if(tool_selected == "lastik"):
            clear_obl = None
            if(fon == "kletka"):
                clear_obl = sheet_kletka_image.crop((event.x-1, event.y, event.x + 50, event.y + 50))
            else:
                clear_obl = sheet_linea_image.crop((event.x-1, event.y, event.x + 50, event.y + 50))
            img.paste(clear_obl, (event.x, event.y))

            clobl = ImageTk.PhotoImage(clear_obl)
            fon_canvas.create_image(event.x, event.y, anchor=NW, image=clobl)
            imagelist.append(clobl)
    


    def config(event):
        Tools_menu.place(x=(paintWIN .winfo_width() - 1100) / 2)
        fon_canvas.place(x=(paintWIN .winfo_width() - 1200) / 2)


    paintWIN = Toplevel(root)
    paintWIN .geometry(f'1250x750+100+100')
    paintWIN .minsize(1250, 750)
    paintWIN .configure(background="#9e9b9b")
    paintWIN .title("paint")

    paintWIN.bind("<Configure>", config)


    Tools_menu = LabelFrame(paintWIN , text="Инструменты", background="#ffffff", height=100, width=1100)
    Tools_menu.place(x=20, y=5)
    Tools_menu.propagate(0)


    fon_canvas = Canvas(paintWIN , bg="white", width=1200, height=600, cursor= "target")  #cursor= "@resurs/Normal.cur"
    fon_canvas.place(x=50, y=130)
    fon_canvas.bind("<B1-Motion>", draw)
    fon_canvas.bind('<Button-1>', draw_click)
    fon_canvas.bind('<ButtonRelease-1>', draw_stop)

root = Tk()
root.geometry(f'500x400+100+100')
root.resizable(False, False)
root.title("paint main menu")
root.configure(background="#ffffff")

img = Image.new('RGB', (1200, 600), 'white')
drawer = ImageDraw.Draw(img)
pipi = ImageTk.PhotoImage(img)

points = []
imagelist = []
fon = "None"
tool_selected = "pen"

start_button= ttk.Button(root, text="Старт", width=45, cursor="plus", command= start_paint)
start_button.pack()

Ластик просто обрезает фон и вставляет по координатам в canvas. Сначала была проблема в том, что в canvas не получается вставить картинку, как я понял это из-за отсутствия ссылок на картинку, поэтому я создал одну глобальную переменную, но так отображается только одно изображение, я создал глобальную переменную imagelist куда отправлял все ссылки на изображения. После этого всё вроде заработало как надо, но python стал кушать очень много памяти. Я добавил функцию clear_all для очистки canvas и imagelist

def clear_all():
    global img, sheet_linea_image, sheet_kletka_image, pipi, imagelist

    imagelist = []
    fon_canvas.delete("all")

    if(fon == "kletka"):
        img.paste(sheet_kletka_image, (0,0))
    else:
        img.paste(sheet_linea_image, (0,0))
    pipi = ImageTk.PhotoImage(img)
    fon_canvas.create_image(0, 0, anchor=NW, image=pipi)

В итоге почему-то canvas и imagelist очищается, но оперативная память так и остается заполненной Что я делаю не так? Куда вся память уходит? При этом при использовании ластика может уходить до 200мб, а после python крашится


Ответы (0 шт):