Как правильно отслеживать и удалять объекты класса в Python? - PullRequest
0 голосов
/ 31 марта 2020

Я работаю над Python GUI (см. Некоторые неполные фрагменты кода ниже), где мне нужно динамически создавать и удалять вкладки и связанные экземпляры классов.

Я пытаюсь отобразить информацию, извлеченную из файлов в определенной папке. Я перехожу к этой папке и список всех соответствующих файлов в этой папке. В главном окне приложения я отображаю этот список соответствующих файлов. Кроме того, для каждого файла в этом списке я генерирую экземпляр класса (здесь класс OsciCOntroller). Этот экземпляр класса содержит информацию о соответствующем файле и дополнительную информацию. В главном окне, нажав на список файлов, я могу выбрать, какой контент отображать. Контекст отображается в виде вкладки, и, выбрав несколько файлов, я могу отображать несколько вкладок одновременно.

Так выглядит GUI с вкладками и списком файлов

* 1006. *

После запуска я генерирую QTabWidget osci_tab_holder для отображения вкладок в дальнейшем. Также несколько параметров из главного окна передаются классу OsciController. Каждый раз, когда я выбираю новую папку, вызывается _on_selectionchange_dataType (), чтобы очистить список osci_tabs, удалить виджеты каждой бывшей вкладки, также очистить QTabWidget и сгенерировать новые экземпляры OsciController, которые добавляются к слабому узлу osci_tabs.

Каждый раз, когда я перемещаюсь в новую папку, старые OsciControllers могут быть удалены. Однако я обнаружил, что только при перезапуске приложения эти экземпляры фактически открыты для сброса сборщика мусора. Так или иначе, я неправильно выпускаю все экземпляры.

Может ли кто-нибудь из вас представить идею / план действий относительно того, что еще я мог бы попробовать или что я делаю неправильно?

Приветствия, и огромное спасибо! Лукас

class ApplicationWindow(QtWidgets.QMainWindow):
    osci_tabs = weakref.WeakValueDictionary()

    def __init__(self):
        super().__init__()
        OsciController._static_ax = self._static_ax
        OsciController.toolbar = self.toolbar
        self._setup_osci_case()

    def _setup_osci_case(self):
        self.osci_tabs_holder = QtWidgets.QTabWidget()
        self.osci_backlayer.addWidget(self.osci_tabs_holder)


    def _on_selectionchange_dataType(self,item):
            self.osci_tabs.clear()
            OsciController.list_of_osciController.clear()    
            self.osci_tabs_holder.clear()

            for osci_file in itemsTextList:
                self.osci_tabs[osci_file.text()] = OsciController(osci_file, self.osci_tabs_holder)

class OsciController(QtWidgets.QWidget):
    list_of_osciController = weakref.WeakValueDictionary()
    _counter = 0

    def __init__(self, item, parent = None):
        gc.collect()
        OsciController._counter += 1
        super(OsciController, self).__init__(parent)

        self.parent = parent
        self.list_of_osciController[item.text()] = self

    def __del__(self):
        OsciController._counter -= 1
...