PyQT5: Связь между spinBox и comboBox
Помогите с логикой, пожалуйста.
Есть 2 spinBox и 2 комбобокс
При выборе значения комбобокс нужно взять значения из спинбоксов, сложить те из них у которых выбрано то же самое значение комбобокса и вывести результат сложения в Label.
Получился вот такой код, но при изменении значения комбобокса происходит повторное сложение, а нужно чтобы spinBoxы складывались только один раз.
WARNING: Any manual changes made to this file will be lost when pyuic5 is run again. Do not edit this file unless you know what you are doing.
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(344, 226)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.spinBox = QtWidgets.QSpinBox(self.centralwidget)
self.spinBox.setGeometry(QtCore.QRect(40, 60, 42, 22))
self.spinBox.setObjectName("spinBox")
self.power1 = QtWidgets.QLabel(self.centralwidget)
self.power1.setGeometry(QtCore.QRect(200, 60, 47, 13))
self.power1.setObjectName("power1")
self.comboBox = QtWidgets.QComboBox(self.centralwidget)
self.comboBox.setGeometry(QtCore.QRect(98, 60, 81, 22))
self.comboBox.setObjectName("comboBox")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.power2 = QtWidgets.QLabel(self.centralwidget)
self.power2.setGeometry(QtCore.QRect(200, 90, 47, 13))
self.power2.setObjectName("power2")
self.comboBox2 = QtWidgets.QComboBox(self.centralwidget)
self.comboBox2.setGeometry(QtCore.QRect(98, 90, 81, 22))
self.comboBox2.setObjectName("comboBox2")
self.comboBox2.addItem("")
self.comboBox2.addItem("")
self.comboBox2.addItem("")
self.spinBox2 = QtWidgets.QSpinBox(self.centralwidget)
self.spinBox2.setGeometry(QtCore.QRect(40, 90, 42, 22))
self.spinBox2.setObjectName("spinBox2")
MainWindow.setCentralWidget(self.centralwidget)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
# self.spinBox2.valueChanged.connect(self.getValue2)
self.comboBox.currentIndexChanged.connect(self.checkState1)
self.comboBox2.currentIndexChanged.connect(self.checkState2)
self.power_AMP1 = 0
self.power_AMP2 = 0
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.power1.setText(_translate("MainWindow", "TextLabel"))
self.comboBox.setItemText(0, _translate("MainWindow", "Не выбран"))
self.comboBox.setItemText(1, _translate("MainWindow", "1"))
self.comboBox.setItemText(2, _translate("MainWindow", "2"))
self.power2.setText(_translate("MainWindow", "TextLabel"))
self.comboBox2.setItemText(0, _translate("MainWindow", "Не выбран"))
self.comboBox2.setItemText(1, _translate("MainWindow", "1"))
self.comboBox2.setItemText(2, _translate("MainWindow", "2"))
def checkState1(self, state):
if state == 0:
print("Код 0")
elif state == 1:
print("Усилитель 1")
self.power_AMP1 = self.power_AMP1 + self.spinBox.value()
print(self.power_AMP1)
self.power1.setText("<b style='color: blue;'> {} </b> Вт".format(self.power_AMP1))
elif state == 2:
print("Усилитель 2")
self.power_AMP2 = self.power_AMP2 + self.spinBox.value()
print(self.power_AMP2)
self.power2.setText("<b style='color: blue;'> {} </b> Вт".format(self.power_AMP2))
def checkState2(self, state):
if state == 0:
print("Код 0")
elif state == 1:
print("Усилитель 1")
self.power_AMP1 = self.power_AMP1 + self.spinBox2.value()
print(self.power_AMP1)
self.power1.setText("<b style='color: blue;'> {} </b> Вт".format(self.power_AMP1))
elif state == 2:
print("Усилитель 2")
self.power_AMP2 = self.power_AMP2 + self.spinBox2.value()
print(self.power_AMP2)
self.power2.setText("<b style='color: blue;'> {} </b> Вт".format(self.power_AMP2))
def getValue2(self, value):
self.power2.setText("<b style='color: blue;'> {} </b>".format(value))
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
Ответы (1 шт):
НИКОГДА НЕ ИЗМЕНЯЙТЕ код, сгенерированный Qt Designer, НИКОГДА.
Создайте другой класс, который наследуется от соответствующего виджета, и используйте созданный класс для его заполнения.
С логикой - попробуйте так. Если я что-то не так понял - скажите, я подправлю.
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(344, 226)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.spinBox = QtWidgets.QSpinBox(self.centralwidget)
self.spinBox.setGeometry(QtCore.QRect(40, 60, 42, 22))
self.spinBox.setObjectName("spinBox")
self.power1 = QtWidgets.QLabel(self.centralwidget)
self.power1.setGeometry(QtCore.QRect(200, 60, 47, 13))
self.power1.setObjectName("power1")
self.comboBox = QtWidgets.QComboBox(self.centralwidget)
self.comboBox.setGeometry(QtCore.QRect(98, 60, 81, 22))
self.comboBox.setObjectName("comboBox")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.power2 = QtWidgets.QLabel(self.centralwidget)
self.power2.setGeometry(QtCore.QRect(200, 90, 47, 13))
self.power2.setObjectName("power2")
self.comboBox2 = QtWidgets.QComboBox(self.centralwidget)
self.comboBox2.setGeometry(QtCore.QRect(98, 90, 81, 22))
self.comboBox2.setObjectName("comboBox2")
self.comboBox2.addItem("")
self.comboBox2.addItem("")
self.comboBox2.addItem("")
self.spinBox2 = QtWidgets.QSpinBox(self.centralwidget)
self.spinBox2.setGeometry(QtCore.QRect(40, 90, 42, 22))
self.spinBox2.setObjectName("spinBox2")
MainWindow.setCentralWidget(self.centralwidget)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.power1.setText(_translate("MainWindow", "TextLabel"))
self.comboBox.setItemText(0, _translate("MainWindow", "Не выбран"))
self.comboBox.setItemText(1, _translate("MainWindow", "1"))
self.comboBox.setItemText(2, _translate("MainWindow", "2"))
self.power2.setText(_translate("MainWindow", "TextLabel"))
self.comboBox2.setItemText(0, _translate("MainWindow", "Не выбран"))
self.comboBox2.setItemText(1, _translate("MainWindow", "1"))
self.comboBox2.setItemText(2, _translate("MainWindow", "2"))
class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
def __init__(self):
super().__init__()
self.setupUi(self)
# !!! тут ваша логика
self.spinBox.valueChanged.connect(lambda: self.get_value_spinBox('AMP1')) # +++
self.spinBox2.valueChanged.connect(lambda: self.get_value_spinBox('AMP2')) # +++
self.comboBox.currentIndexChanged.connect(self.checkState1)
self.comboBox2.currentIndexChanged.connect(self.checkState2)
self.power_AMP1 = 0
self.power_AMP2 = 0
self.power_AMP = 0
def get_value_spinBox(self, amp): # +++
if amp == 'AMP1':
self.power_AMP1 = self.spinBox.value()
elif amp == 'AMP2':
self.power_AMP2 = self.spinBox2.value()
self.power_AMP = self.power_AMP1 + self.power_AMP2 # +++ self.power_AMP
print(f'power_AMP1 = {self.power_AMP1}; power_AMP2 = {self.power_AMP2}; power_AMP = {self.power_AMP}')
def checkState1(self, state):
print()
if state == 0:
print("Код 0")
self.power1.setText("TextLabel")
if not self.comboBox2.currentIndex():
self.power2.setText("TextLabel")
elif state == 1:
print(f"Усилитель 1 {self.power_AMP}")
self.power1.setText("<b style='color: blue;'> {} </b> Вт".format(self.power_AMP)) # power_AMP
elif state == 2:
print(f"Усилитель 2 {self.power_AMP}")
self.power2.setText("<b style='color: blue;'> {} </b> Вт".format(self.power_AMP)) # power_AMP
def checkState2(self, state):
print()
if state == 0:
print("Код 0")
self.power2.setText("TextLabel")
if not self.comboBox.currentIndex():
self.power1.setText("TextLabel")
elif state == 1:
print(f"Усилитель 1 {self.power_AMP}")
self.power1.setText("<b style='color: blue;'> {} </b> Вт".format(self.power_AMP))
elif state == 2:
print(f"Усилитель 2 {self.power_AMP}")
self.power2.setText("<b style='color: blue;'> {} </b> Вт".format(self.power_AMP))
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
'''
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
'''
w = MainWindow()
w.show()
sys.exit(app.exec_())
