При очистке 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 крашится