Должен построить QApp перед QWidget Pyqt5

Я запустил новую программу PyQt5, но я сталкиваюсь с ошибкой "Должен создать QApplication перед QWidget".

Я понимаю ошибку, но не могу найти, где мой код сначала строит мой QWidget.

Вот мой код:

class Main(QWidget):
    """ Main window """
    def __init__(self, *args):
        QWidget.__init__(self, *args)
        self.business_list = ['Acheté à', 'Vendu à']

    # Pet form
    petFormGroupBox = QGroupBox("Description de l'animal")
    pet_layout = QFormLayout()
    pet_layout.addRow(QLabel("Nom scientifique:"), QLineEdit())
    pet_layout.addRow(QLabel("Sexe:"), QLineEdit())
    pet_layout.addRow(QLabel("Année de naissance:"), QDateEdit())
    pet_layout.addRow(QLabel("Cause décès:"), QLineEdit())
    petFormGroupBox.setLayout(pet_layout)

    # Business form
    petBusinessFormGroupBox = QGroupBox("Achats / Ventes")
    pet_business_layout = QFormLayout()
    pet_layout.addRow(QLabel("Nom complet + N° d'autorisation"), QLineEdit())
    petBusinessFormGroupBox.setLayout(pet_business_layout)

    business_btn_group = QRadioButton()

    for each in self.business_list:
        self.business_list.append(QRadioButton(each))

    self.business_list[0].setChecked(True)
    business_choices_layout = QHBoxLayout()
    counter = 1
    for each in self.business_list:
        business_choices_layout.addWidget(each)
        business_btn_group.addButton(each)
        business_btn_group.setId(each, counter)

    pet_business_layout.addWidget(business_choices_layout)

    hbox = QHBoxLayout()
    hbox.addWidget(pet_layout)
    hbox.addWidget(pet_business_layout)

    self.setLayout(hbox)

class Cites(QMainWindow):
    """ Cites app """
    def __init__(self):
        QMainWindow.__init__(self)
        self.setWindowTitle('CITES')
        self.setWindowState(Qt.WindowMaximized)

        exitAct = QAction(QIcon('exit24.png'), 'Exit', self)
        exitAct.setShortcut('Ctrl+Q')
        exitAct.triggered.connect(qApp.quit)

        fileMenu = self.menuBar().addMenu('File')
        fileMenu.addAction(exitAct)

        toolbar = self.addToolBar('Main')
        toolbar.addAction(exitAct)

        main = Main()
        self.setCentralWidget(main)

        self.statusBar().showMessage('Bienvenue dans CITES')

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Cites()
    ex.show()
    sys.exit(app.exec_())

Если у вас есть идеи, я счастлив!

Счастливого нового года и наслаждайтесь вашим кодом:).

спасибо за аванс

1 ответ

Решение

Ваш код не был правильно написан. Все строки в Main класс после # Pet form должен был иметь два отступа (то есть 8 пробелов), чтобы они были частью __init__ конструктор. Таким образом, он будет выполняться при создании объекта типа Main(), что должно быть сделано после того, как вы создали QApplication объект.

В настоящее время он отступается только один раз (то есть 4 пробела), что означает, что он является частью определения класса. Эти строки выполняются во время определения класса, прежде чем вы создадите QApplication объект. Отсюда и сообщение об ошибке.

Исправить несложно, просто сделайте отступ кода следующим образом:

class Main(QWidget):
    """ Main window """
    def __init__(self, *args):
        QWidget.__init__(self, *args)
        self.business_list = ['Acheté à', 'Vendu à']

        # Pet form
        petFormGroupBox = QGroupBox("Description de l'animal")
        pet_layout = QFormLayout()
        pet_layout.addRow(QLabel("Nom scientifique:"), QLineEdit())
        pet_layout.addRow(QLabel("Sexe:"), QLineEdit())
        pet_layout.addRow(QLabel("Année de naissance:"), QDateEdit())
        pet_layout.addRow(QLabel("Cause décès:"), QLineEdit())
        petFormGroupBox.setLayout(pet_layout)

        # Business form
        petBusinessFormGroupBox = QGroupBox("Achats / Ventes")
        pet_business_layout = QFormLayout()
        pet_layout.addRow(QLabel("Nom complet + N° d'autorisation"), QLineEdit())
        petBusinessFormGroupBox.setLayout(pet_business_layout)

        business_btn_group = QRadioButton()

        for each in self.business_list:
            self.business_list.append(QRadioButton(each)) # infinite recursion here!

        self.business_list[0].setChecked(True)
        business_choices_layout = QHBoxLayout()
        counter = 1
        for each in self.business_list:
            business_choices_layout.addWidget(each)
            business_btn_group.addButton(each)
            business_btn_group.setId(each, counter)

        pet_business_layout.addWidget(business_choices_layout)

        hbox = QHBoxLayout()
        hbox.addWidget(pet_layout)
        hbox.addWidget(pet_business_layout)

        self.setLayout(hbox)

Обратите внимание, что код теперь будет висеть в следующем цикле, потому что вы добавляете элемент в список, повторяя этот цикл. Это то, что вы должны исправить сами.

for each in self.business_list:
    self.business_list.append(QRadioButton(each)) # infinite recursion here!
Другие вопросы по тегам