Если у вашего виджета нет дочерних виджетов, которые зависят от него, я думаю, вы можете использовать:
layout.removeWidget(self.widget_name)
self.widget_name.deleteLater()
self.widget_name = None
в моих тестах, когда это виджет с дочерними элементами, вы должны:
import sip
layout.removeWidget(self.widget_name)
sip.delete(self.widget_name)
self.widget_name = None
если у вас нет имени переменной для виджета на уровне класса или на глобальном уровне, вы все равно можете удалить его из макета с помощью layout.takeAt (index) и получить указатель на виджет из QLayoutItem, который эта функция возвращает с помощью QLayoutItem.widget () метод, в этом случае вам не нужно присваивать None имя переменной, потому что на нее нет ссылок за пределами вашей функции.
Попробуйте оба метода и посмотрите, что работает для вас (не теряйте память после повторения много раз).