必须在QWidget Pyqt5之前构造QApp
must construct QApp before QWidget Pyqt5
我启动了新的 PyQt5 程序,但遇到错误 "Must construct QApplication before 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_())
如果你有什么想法,我很高兴!
新年快乐,享受你的代码:)。
谢谢预付
您的代码缩进不正确。 Main
class 中 # Pet form
之后的所有行都应该缩进两次(即 8 个空格),以便它们成为 __init__
构造函数的一部分。这样它将在您创建类型为 Main()
的对象时执行,这应该在您创建了 QApplication
对象之后执行。
目前它只缩进一次(即 4 个空格),这意味着它是 class 定义的一部分。因此,在创建 QApplication
对象之前,这些行在 class 定义期间执行。因此出现错误消息。
修复很简单,只需像这样缩进代码即可:
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!
我启动了新的 PyQt5 程序,但遇到错误 "Must construct QApplication before 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_())
如果你有什么想法,我很高兴!
新年快乐,享受你的代码:)。
谢谢预付
您的代码缩进不正确。 Main
class 中 # Pet form
之后的所有行都应该缩进两次(即 8 个空格),以便它们成为 __init__
构造函数的一部分。这样它将在您创建类型为 Main()
的对象时执行,这应该在您创建了 QApplication
对象之后执行。
目前它只缩进一次(即 4 个空格),这意味着它是 class 定义的一部分。因此,在创建 QApplication
对象之前,这些行在 class 定义期间执行。因此出现错误消息。
修复很简单,只需像这样缩进代码即可:
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!