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)"
  • Вопрос задан
  • 285 просмотров
Решения вопроса 1
JaxxDexx
@JaxxDexx
Вынесите создание вкладки в отдельный метод, который будет отвечать ТОЛЬКО за создание вкладки! Вызывайте его при инициализации для создания первой вкладки. Метод addProjectTab используйте только при нажатии кнопки "Добавить", и в нем вызывайте сначала метод по созданию вкладки, а потом уже делайте активной кнопку "Удалить" (Ну или наоборот, тут уже не важно).
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы