I’m facing a memory leak issue with a custom widget in a Tkinter/customtkinter application. Despite my efforts to manually delete and clear all member variables, the memory is not being fully cleaned up. Below is the relevant code for my custom class.
import tkinter
import webbrowser
import customtkinter as ctk
from typing import List, Union, Tuple
from tkinter import PhotoImage
import pyperclip
from utils import (
ValueConvertUtility,
)
from widgets.components.thumbnail_button import (
ThumbnailButton,
)
from services import (
ThemeManager, LanguageManager
)
from settings import (
AppearanceSettings
)
class Video(ctk.CTkFrame):
"""A class representing a video widget."""
default_thumbnails: Tuple[tkinter.PhotoImage, tkinter.PhotoImage] = (None, None)
def __init__(
self,
root: ctk.CTk,
master: Union[ctk.CTkFrame, ctk.CTkScrollableFrame],
width: int = 0,
height: int = 0,
# video info
video_url: str = "",
video_title: str = "-------",
channel: str = "-------",
thumbnails: List[PhotoImage] = (None, None),
channel_url: str = "-------",
length: int = 0):
super().__init__(
master=master,
height=height,
width=width,
border_width=1,
corner_radius=8,
)
self.root = root
self.master = master
self.height: int = height
self.width: int = width
# video details
self.video_url: str = video_url
self.video_title: str = video_title
self.channel: str = channel
self.channel_url: str = channel_url
self.length: int = length
self.thumbnails: List[PhotoImage] = thumbnails
# widgets
self.info_frame: Union[ctk.CTkFrame, None] = None
self.url_label: Union[ctk.CTkLabel, None] = None
self.video_title_label: Union[ctk.CTkLabel, None] = None
self.channel_btn: Union[ctk.CTkButton, None] = None
self.video_length_label: Union[ctk.CTkLabel, None] = None
self.thumbnail_btn: Union[ThumbnailButton, None] = None
self.remove_btn: Union[ctk.CTkButton, None] = None
from widgets import ContextMenu
self.context_menu: Union['ContextMenu', None] = None
# initialize the object
self.create_widgets()
self.set_widgets_texts()
self.set_widgets_sizes()
self.set_widgets_fonts()
self.set_widgets_colors()
self.set_tk_widgets_colors()
self.set_widgets_accent_color()
self.place_widgets()
self.bind_widgets_events()
# register to Theme Manger for accent color updates & widgets colors updates
ThemeManager.register_widget(self)
LanguageManager.register_widget(self)
"""
other methods
"""
def __del__(self):
"""Clear the Memory."""
del self.height
del self.width
# video details
del self.video_url
del self.video_title
del self.channel
del self.channel_url
del self.length
del self.thumbnails
# widgets
del self.info_frame
del self.url_label
del self.video_title_label
del self.channel_btn
del self.video_length_label
del self.remove_btn
del self.context_menu
del self.thumbnail_btn
del self
def destroy_widgets(self):
"""Destroy the child widget."""
self.video_length_label.destroy()
self.info_frame.destroy()
self.video_title_label.destroy()
self.channel_btn.destroy()
self.url_label.destroy()
self.remove_btn.destroy()
self.destroy()
def kill(self):
"""Destroy the widget."""
ThemeManager.unregister_widget(self)
LanguageManager.unregister_widget(self)
self.pack_forget()
self.destroy_widgets()
self.__del__()
I am trying to understand why this is not getting cleaned and what is wrong here.