首页 > 解决方案 > 如何仅针对pyqt5中的选定复选框运行代码?

问题描述

我正在尝试使用 pyqt5 制作菜单 GUI,菜单包括饮料和其他东西。在每个菜单项前面都有一个复选框,当它被选中时,它的价格将被添加到账单中。

self.latte_box = QtWidgets.QCheckBox(self.horizontalLayoutWidget)   #latte_box is the name of the checkbox
self.latte_box.setText("")
self.latte_box.setObjectName("latte_box")
self.horizontalLayout.addWidget(self.latte_box)
    
self.latte_box.stateChanged.connect(self.order)


self.cookie_box = QtWidgets.QCheckBox(self.horizontalLayoutWidget_3)
self.cookie_box.setText("")
self.cookie_box.setObjectName("cookie_box")
self.horizontalLayout_3.addWidget(self.cookie_box)

self.cookie_box.stateChanged.connect(self.order)    


bill = 0   #the bill variable
def order(self):
   if self.latte_box.isChecked():
      bill += 2.85
   else:
      bill -= 2.85

   if self.cookie_box.isChecked():
      bill += 1.50
   else:
      bill -= 1.50

latte_box 和 cookie_box 是列表中 2 个项目的复选框,价格分别为 2.85 美元和 1.50 美元。因此,当用户选中该框时,该项目的价格将被添加到账单中,但如果出现错误,用户只需取消选中该框,该项目的价格将从账单中删除。

这里的问题是所有项目都通过方法(订单)运行,是否选中该框则添加价格,如果未选中则删除该价格。

如何只有选中或未选中的框通过该方法,而未触及的框保持静止..?

标签: checkboxpyqt5

解决方案


试试看:

import sys
from PyQt5 import QtCore, QtGui, QtWidgets 
from PyQt5.Qt import *


class Window(QWidget):
    def __init__(self):
        super().__init__()

        self.latte_box = QtWidgets.QCheckBox()   
        self.latte_box.setText("2.85")
        self.latte_box.stateChanged.connect(lambda state, cb=self.latte_box: self.order(state, cb))


        self.cookie_box = QtWidgets.QCheckBox()
        self.cookie_box.setText("1.50")
        self.cookie_box.stateChanged.connect(lambda state, cb=self.cookie_box: self.order(state, cb))  

        self.label = QLabel()        
        
        self.layout = QGridLayout(self)
        self.layout.addWidget(self.latte_box, 0, 0)
        self.layout.addWidget(self.cookie_box, 0, 1)
        self.layout.addWidget(self.label, 1, 0)

        self.bill = 0   
        
    def order(self, state, cb):
        if cb is self.latte_box:     
            if state:
                self.bill += 2.85
            else:
                self.bill -= 2.85          
        elif cb is self.cookie_box:        
            if state:
                self.bill += 1.50
            else:
                self.bill -= 1.50  
                
        self.label.setText(f'{abs(self.bill):.2f}')


if __name__ == '__main__':
    import sys
    app = QApplication(sys.argv)
    form = Window()
    form.show()
    sys.exit(app.exec_())

在此处输入图像描述


推荐阅读