Должен построить 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!