Dr_Elvis
@Dr_Elvis
В гугле забанен

Как правильно организовать код?

Привет!
Пишу программу с GUI. Есть главный класс, в нем определен метод который при инициализации строит интерфейс. В этом интерфейсе(часть его) есть одна вкладка, а так же 2 кнопки - добавить и удалить вкладку. наполнение вкладки реализовано в другом методе, так как наполнение одинаковое.
Нужно чтобы было так: при открытии программы должна появиться одна вкладка, кнопка добавить должна быть активной, а кнопка удалить не активной, так как последнюю вкладку закрыть нельзя. после добавления вкладки кнопкой "Добавить" кнопка "Удалить" становится активной( до момента пока не останется всего 1 вкладка).
Как у меня идет в коде(основные куски):
Добавление вкладки, где происходит вызов метода добавления
self.H2layout = QtWidgets.QHBoxLayout()
self.tabWidgets = QtWidgets.QTabWidget(self)
self.tabWidgets.setGeometry(QtCore.QRect(10, 170, 541, 351))
self.addProjectTab()
self.H2layout.addWidget(self.tabWidgets)
self.Vlayout.addLayout(self.H2layout)

Далее ниже идет добавления кнопок:
self.buttonAddProject = QtWidgets.QPushButton(self.frame)
self.buttonAddProject.setGeometry(QtCore.QRect(266, 5, 131, 23))
self.buttonAddProject.setText('Добавить проект')
self.buttonAddProject.clicked.connect(self.addProjectTab)
self.buttonDelProject = QtWidgets.QPushButton(self.frame)
self.buttonDelProject.setGeometry(QtCore.QRect(406, 5, 131, 23))
self.buttonDelProject.setText('Удалить этот проект')
self.buttonDelProject.setEnabled(False)
self.buttonDelProject.clicked.connect(self.delProjectTab)

Далее идет метод, который добавляет вкладку с содержимым(содержимое опустил, оно не важно, добавляется корректно):
def addProjectTab(self):
    self.buttonDelProject.setEnabled(True)
    self.tab = QtWidgets.QWidget()
    ...

Ну и удаление вкладки:
def delProjectTab(self):
    if self.tabWidgets.count() > 1:
        self.tabWidgets.removeTab(self.tabWidgets.currentIndex())
        if self.tabWidgets.count() == 1:
            self.buttonDelProject.setEnabled(False)
        else:
            self.buttonDelProject.setEnabled(True)
    else:
        pass

При таком раскладе я получаю конечно же ошибку: "AttributeError: 'mainForm' object has no attribute 'buttonDelProject'"
Оно и понятно, так как у меня идет вызов добавления вкладки, а там первой строчкой идет что нужно сделать кнопку "Удалить" активной, когда по коду кнопки еще даже не существует.
Вот у меня вопрос: как правильно оформить код чтобы нормально реализовывалось вышеописанное?
Варианты у меня такие:
- поменять местами добавление кнопок и добавление вкладки, но тут придется немного мудрить, так как порядок слоев уже будет не тот
- спустить вызов self.addProjectTab() ниже создания кнопок + добавить условие как в методе delProjectTab на определение количества вкладок и в зависимости от этого активировать или деактивировать кнопку "Удалить"

Подскажите правильный способ.

UPD:
еще вариант оставить всё как есть, но в "addProjectTab" обернуть в try-except "self.buttonDelProject.setEnabled(True)"
  • Вопрос задан
  • 302 просмотра
Решения вопроса 1
JaxxDexx
@JaxxDexx
Вынесите создание вкладки в отдельный метод, который будет отвечать ТОЛЬКО за создание вкладки! Вызывайте его при инициализации для создания первой вкладки. Метод addProjectTab используйте только при нажатии кнопки "Добавить", и в нем вызывайте сначала метод по созданию вкладки, а потом уже делайте активной кнопку "Удалить" (Ну или наоборот, тут уже не важно).
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы