PyQt5: не отображает Layout'ы
Разрабатываю симулятор парламентских голосований на Python с использованием PyQt5. К сожалению, столкнулся с проблемой, в которой программа не выдает ошибок, но код исполняется неправильно, вероятнее всего, ввиду неправильно построенной функции. Прошу помочь.
Фрагмент кода ниже должен выводить во фрейме данные в следующем виде:
<Название 1 партии> <Button 1-го депутата> <Button 2-го депутата> <Button 3-го депутата>
<Название 2 партии> <Button 4-го депутата> <Button 5-го депутата> <Button 6-го депутата>
и т.д.
app.py
from PyQt5.QtGui import QColor, QPalette
from PyQt5.QtWidgets import QMainWindow, QApplication, QMessageBox, QWidget, QHBoxLayout, QLabel
from PyQt5.QtWidgets import QPushButton
import parliament_design as design
import sys
import ops
class MainWindow(QMainWindow, design.Ui_Form):
def __init__(self):
super().__init__()
self.setupUi(self)
self.voteButton.clicked.connect(self.vote_bill)
parties = ops.get_all_parties()
for x in parties:
self.mandatesLayout.mandate_lay_widget = QWidget(self.gridLayoutWidget)
self.mandatesLayout.mandate_layout = QHBoxLayout(self.mandatesLayout.mandate_lay_widget)
self.mandatesLayout.mandate_layout.setObjectName("layoutParty_{}".format(x.id))
self.mandatesLayout.addWidget(self.mandatesLayout.mandate_lay_widget)
party_name = QLabel(x.name)
self.mandatesLayout.mandate_layout.addWidget(party_name)
senators = ops.get_all_senators()
for y in senators:
if y.party == x.id:
mandate_lay_widget = QWidget(self.gridLayoutWidget)
mandate_layout = QHBoxLayout(self.mandatesLayout.mandate_lay_widget)
self.mandatesLayout.mandate_layout.addWidget(mandate_lay_widget)
mandate = QPushButton(text="{}".format(y.name))
mandate.setStyleSheet("background-color:rgb({})".format(x.rgb_code))
mandate_layout.addWidget(mandate)
if __name__ == "__main__":
ops.test_init()
app = QApplication(sys.argv)
main_window = MainWindow()
main_window.show()
sys.exit(app.exec_())
parliament_design.py (для воспроизводимого примера)
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(740, 578)
self.gridLayoutWidget = QtWidgets.QWidget(Form)
self.gridLayoutWidget.setGeometry(QtCore.QRect(10, 290, 721, 271))
self.gridLayoutWidget.setObjectName("gridLayoutWidget")
self.mandatesLayout = QtWidgets.QGridLayout(self.gridLayoutWidget)
self.mandatesLayout.setContentsMargins(0, 0, 0, 0)
self.mandatesLayout.setObjectName("mandatesLayout")
self.frame = QtWidgets.QFrame(Form)
self.frame.setGeometry(QtCore.QRect(430, 90, 301, 181))
self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel)
self.frame.setFrameShadow(QtWidgets.QFrame.Raised)
self.frame.setObjectName("frame")
self.verticalLayoutWidget = QtWidgets.QWidget(self.frame)
self.verticalLayoutWidget.setGeometry(QtCore.QRect(0, 0, 301, 181))
self.verticalLayoutWidget.setObjectName("verticalLayoutWidget")
self.verticalLayout = QtWidgets.QVBoxLayout(self.verticalLayoutWidget)
self.verticalLayout.setContentsMargins(0, 3, 0, 0)
self.verticalLayout.setObjectName("verticalLayout")
self.chooseBillList = QtWidgets.QComboBox(self.verticalLayoutWidget)
self.chooseBillList.setWhatsThis("")
self.chooseBillList.setObjectName("chooseBillList")
self.verticalLayout.addWidget(self.chooseBillList)
self.forRadio = QtWidgets.QRadioButton(self.verticalLayoutWidget)
self.forRadio.setObjectName("forRadio")
self.verticalLayout.addWidget(self.forRadio)
self.againstRadio = QtWidgets.QRadioButton(self.verticalLayoutWidget)
self.againstRadio.setObjectName("againstRadio")
self.verticalLayout.addWidget(self.againstRadio)
self.neutralRadio = QtWidgets.QRadioButton(self.verticalLayoutWidget)
self.neutralRadio.setObjectName("neutralRadio")
self.verticalLayout.addWidget(self.neutralRadio)
self.voteButton = QtWidgets.QPushButton(self.verticalLayoutWidget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Maximum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.voteButton.sizePolicy().hasHeightForWidth())
self.voteButton.setSizePolicy(sizePolicy)
self.voteButton.setObjectName("voteButton")
self.verticalLayout.addWidget(self.voteButton)
self.newBillButton = QtWidgets.QPushButton(self.verticalLayoutWidget)
self.newBillButton.setObjectName("newBillButton")
self.verticalLayout.addWidget(self.newBillButton)
self.formLayoutWidget = QtWidgets.QWidget(Form)
self.formLayoutWidget.setGeometry(QtCore.QRect(10, 90, 411, 181))
self.formLayoutWidget.setObjectName("formLayoutWidget")
self.formLayout = QtWidgets.QFormLayout(self.formLayoutWidget)
self.formLayout.setContentsMargins(0, 32, 0, 30)
self.formLayout.setObjectName("formLayout")
self.votedForDescLabel = QtWidgets.QLabel(self.formLayoutWidget)
font = QtGui.QFont()
font.setBold(True)
font.setUnderline(True)
font.setWeight(75)
self.votedForDescLabel.setFont(font)
self.votedForDescLabel.setObjectName("votedForDescLabel")
self.formLayout.setWidget(0, QtWidgets.QFormLayout.LabelRole, self.votedForDescLabel)
self.horizontalLayout = QtWidgets.QHBoxLayout()
self.horizontalLayout.setObjectName("horizontalLayout")
self.votedForLabel = QtWidgets.QLabel(self.formLayoutWidget)
font = QtGui.QFont()
font.setBold(True)
font.setWeight(75)
self.votedForLabel.setFont(font)
self.votedForLabel.setObjectName("votedForLabel")
self.horizontalLayout.addWidget(self.votedForLabel)
self.votedForStatusBar = QtWidgets.QProgressBar(self.formLayoutWidget)
self.votedForStatusBar.setProperty("value", 0)
self.votedForStatusBar.setObjectName("votedForStatusBar")
self.horizontalLayout.addWidget(self.votedForStatusBar)
self.formLayout.setLayout(0, QtWidgets.QFormLayout.FieldRole, self.horizontalLayout)
self.votedAgainstDescLabel = QtWidgets.QLabel(self.formLayoutWidget)
font = QtGui.QFont()
font.setBold(True)
font.setUnderline(True)
font.setWeight(75)
self.votedAgainstDescLabel.setFont(font)
self.votedAgainstDescLabel.setObjectName("votedAgainstDescLabel")
self.formLayout.setWidget(1, QtWidgets.QFormLayout.LabelRole, self.votedAgainstDescLabel)
self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
self.horizontalLayout_2.setObjectName("horizontalLayout_2")
self.votedAgainstLabel = QtWidgets.QLabel(self.formLayoutWidget)
font = QtGui.QFont()
font.setBold(True)
font.setWeight(75)
self.votedAgainstLabel.setFont(font)
self.votedAgainstLabel.setObjectName("votedAgainstLabel")
self.horizontalLayout_2.addWidget(self.votedAgainstLabel)
self.votedAgainstStatusBar = QtWidgets.QProgressBar(self.formLayoutWidget)
self.votedAgainstStatusBar.setProperty("value", 0)
self.votedAgainstStatusBar.setObjectName("votedAgainstStatusBar")
self.horizontalLayout_2.addWidget(self.votedAgainstStatusBar)
self.formLayout.setLayout(1, QtWidgets.QFormLayout.FieldRole, self.horizontalLayout_2)
self.votedNeutralDescLabel = QtWidgets.QLabel(self.formLayoutWidget)
font = QtGui.QFont()
font.setBold(True)
font.setUnderline(True)
font.setWeight(75)
self.votedNeutralDescLabel.setFont(font)
self.votedNeutralDescLabel.setAutoFillBackground(False)
self.votedNeutralDescLabel.setObjectName("votedNeutralDescLabel")
self.formLayout.setWidget(2, QtWidgets.QFormLayout.LabelRole, self.votedNeutralDescLabel)
self.horizontalLayout_3 = QtWidgets.QHBoxLayout()
self.horizontalLayout_3.setObjectName("horizontalLayout_3")
self.votedNeutralLabel = QtWidgets.QLabel(self.formLayoutWidget)
font = QtGui.QFont()
font.setBold(True)
font.setWeight(75)
self.votedNeutralLabel.setFont(font)
self.votedNeutralLabel.setObjectName("votedNeutralLabel")
self.horizontalLayout_3.addWidget(self.votedNeutralLabel)
self.votedNeutralStatusBar = QtWidgets.QProgressBar(self.formLayoutWidget)
self.votedNeutralStatusBar.setProperty("value", 0)
self.votedNeutralStatusBar.setObjectName("votedNeutralStatusBar")
self.horizontalLayout_3.addWidget(self.votedNeutralStatusBar)
self.formLayout.setLayout(2, QtWidgets.QFormLayout.FieldRole, self.horizontalLayout_3)
self.commonSenatorsDescLabel = QtWidgets.QLabel(self.formLayoutWidget)
font = QtGui.QFont()
font.setUnderline(True)
self.commonSenatorsDescLabel.setFont(font)
self.commonSenatorsDescLabel.setObjectName("commonSenatorsDescLabel")
self.formLayout.setWidget(3, QtWidgets.QFormLayout.LabelRole, self.commonSenatorsDescLabel)
self.senatorsAmountLabel = QtWidgets.QLabel(self.formLayoutWidget)
self.senatorsAmountLabel.setObjectName("senatorsAmountLabel")
self.formLayout.setWidget(3, QtWidgets.QFormLayout.FieldRole, self.senatorsAmountLabel)
self.votedSenatorsAmountLabel = QtWidgets.QLabel(self.formLayoutWidget)
font = QtGui.QFont()
font.setUnderline(True)
self.votedSenatorsAmountLabel.setFont(font)
self.votedSenatorsAmountLabel.setObjectName("votedSenatorsAmountLabel")
self.formLayout.setWidget(4, QtWidgets.QFormLayout.LabelRole, self.votedSenatorsAmountLabel)
self.senatorsVotedLabel = QtWidgets.QLabel(self.formLayoutWidget)
self.senatorsVotedLabel.setObjectName("senatorsVotedLabel")
self.formLayout.setWidget(4, QtWidgets.QFormLayout.FieldRole, self.senatorsVotedLabel)
self.countryNameLabel = QtWidgets.QLabel(Form)
self.countryNameLabel.setGeometry(QtCore.QRect(10, 20, 711, 61))
font = QtGui.QFont()
font.setPointSize(20)
self.countryNameLabel.setFont(font)
self.countryNameLabel.setObjectName("countryNameLabel")
self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)
def retranslateUi(self, Form):
_translate = QtCore.QCoreApplication.translate
Form.setWindowTitle(_translate("Form", "Form"))
self.chooseBillList.setCurrentText(_translate("Form", "Выберите законопроект..."))
self.chooseBillList.setPlaceholderText(_translate("Form", "Выберите законопроект..."))
self.forRadio.setText(_translate("Form", "За"))
self.againstRadio.setText(_translate("Form", "Против"))
self.neutralRadio.setText(_translate("Form", "Воздержусь"))
self.voteButton.setText(_translate("Form", "ГОЛОСОВАТЬ"))
self.newBillButton.setText(_translate("Form", "ПРЕДЛОЖИТЬ ЗАКОНОПРОЕКТ"))
self.votedForDescLabel.setText(_translate("Form", "ЗА"))
self.votedForLabel.setText(_translate("Form", "0"))
self.votedAgainstDescLabel.setText(_translate("Form", "ПРОТИВ"))
self.votedAgainstLabel.setText(_translate("Form", "0"))
self.votedNeutralDescLabel.setText(_translate("Form", "ВОЗДЕРЖАЛИСЬ"))
self.votedNeutralLabel.setText(_translate("Form", "0"))
self.commonSenatorsDescLabel.setText(_translate("Form", "Общее кол-во депутатов:"))
self.senatorsAmountLabel.setText(_translate("Form", "0"))
self.votedSenatorsAmountLabel.setText(_translate("Form", "Проголосовали:"))
self.senatorsVotedLabel.setText(_translate("Form", "0"))
self.countryNameLabel.setText(_translate("Form", "Парламент"))
Выдает такое окно, в котором почему-то кнопки депутатов совсем не отображаются.
Ответы (1 шт):
parties = ops.get_all_parties()
for x in parties:
self.mandatesLayout.mandate_lay_widget = QWidget(self.gridLayoutWidget)
self.mandatesLayout.mandate_layout = QHBoxLayout(self.mandatesLayout.mandate_lay_widget)
self.mandatesLayout.addWidget(self.mandatesLayout.mandate_lay_widget)
party_name = QLabel(x.name + " ||")
self.mandatesLayout.mandate_layout.addWidget(party_name)
senators = ops.get_all_senators()
for y in senators:
if y.party.id == x.id:
mandate = QPushButton(text="{}".format(y.name))
mandate.setStyleSheet("background-color:rgb({})".format(x.rgb_code))
self.mandatesLayout.mandate_layout.setAlignment(Qt.AlignLeading)
self.mandatesLayout.mandate_layout.addWidget(mandate)
Проблема решена! Всем спасибо, коллеги!

