Python 在PyQt按钮单击期间发送附加变量

Python 在PyQt按钮单击期间发送附加变量,python,python-2.7,pyqt,pyqt4,Python,Python 2.7,Pyqt,Pyqt4,我不熟悉Python和PyQt,这是我的第一个应用程序。当前单击按钮时,toggled()检查self.LedOn以决定是否打开LED class Screen(QWidget): def initUI(self): self.LedOn = 0 btn = QPushButton('Off', self) btn.setCheckable(True) btn.clicked.connect(self.toggleLED

我不熟悉Python和PyQt,这是我的第一个应用程序。当前单击按钮时,
toggled()
检查
self.LedOn
以决定是否打开LED

class Screen(QWidget):

    def initUI(self):
        self.LedOn = 0

        btn = QPushButton('Off', self)
        btn.setCheckable(True)
        btn.clicked.connect(self.toggleLED)


    def toggleLED(self, pressed):

        source = self.sender()

        if self.LedOn:
            source.setText('Off')
            source.LedOn = 0
            self.serial.write('L')
        else:           
            source.setText('On')
            source.LedOn = 1
            self.serial.write('H')
问题:现在,如果我们想要控制多个LED并记住它们各自的切换状态,那么最佳做法是什么

我似乎也无法通过
btn.clicked.connect(self.toggled(btnNumber))


您可以使用
partial

from functools import partial

btn1.clicked.connect(partial(self.toggleLED, 1))

这允许您向一个函数传递多个参数。

QPushButton
已经选中了
布尔属性,因此不需要创建另一个。按钮发出两个信号:

  • 按下时单击
  • 在其状态更改时切换
  • 它们都传递指示按钮状态的参数。但我认为,第二个更合适,因为它的名字

    因此,切换的
    插槽应如下所示:

    def toggleLED(self, checked):
        source = self.sender()
        if checked:
            source.setText('Off')
            self.serial.write('L')
        else:           
            source.setText('On')
            self.serial.write('H')
    
    请注意,只有可检查的按钮发出
    切换的
    信号,但您已经在代码中设置了此属性:

    def initUI(self):
        btn1 = QPushButton('Off', self)
        btn1.setCheckable(True)
        btn1.toggled.connect(self.toggleLED)
    
        btn2 = QPushButton('Off', self)
        btn2.setCheckable(True)
        btn2.toggled.connect(self.toggleLED)
    
  • 可检查的QPushButton将存储状态,因此您不需要
    btn.LedOn
  • 使用
    btn.value
    存储btn号码,因此您无需发送 额外的arg

  • 这是我在这项工作中经常使用的解决方案

    class Screen(QWidget):
    
        def initUI(self):
    
            btn1 = QPushButton('Off', self)
            btn1.setCheckable(True)
            btn1.LedOn= 0
            btn1.clicked.connect(selftoggleLED(1))
    
            btn2 = QPushButton('Off', self)
            btn2.setCheckable(True)
            btn2.LedOn= 0
    
            # I am adding these lines-----------------------
    
            # put all the btns in a list
            btns = [btn1, btn2]
            # connect each btn with the function and pass the same btn
            map(lambda btn: btn.clicked.connect(lambda pressed: self.toggleLED(pressed, btn)), btns)
    
    
        def toggleLED(self, pressed, clikedBtn):
    
            if pressed:
                clickedBtn.setText("On")
                # set other variables you need
            else: 
                clickedBtn.setText("Off")
                # set other variables  
    

    要向函数传递多个参数,可以使用
    functools.partial()
    lambda

    btn2.clicked.connect(lambda: selftoggleLED(2))
    

    阅读。

    我认为您需要对QPushButton进行子类化,并以某种方式重新实现单击或按下信号Emmiter以返回所需的值,但我在pyqt的文档中找不到如何做到这一点
    class Screen(QWidget):
    
        def initUI(self):
    
            btn1 = QPushButton('Off', self)
            btn1.setCheckable(True)
            btn1.LedOn= 0
            btn1.clicked.connect(selftoggleLED(1))
    
            btn2 = QPushButton('Off', self)
            btn2.setCheckable(True)
            btn2.LedOn= 0
    
            # I am adding these lines-----------------------
    
            # put all the btns in a list
            btns = [btn1, btn2]
            # connect each btn with the function and pass the same btn
            map(lambda btn: btn.clicked.connect(lambda pressed: self.toggleLED(pressed, btn)), btns)
    
    
        def toggleLED(self, pressed, clikedBtn):
    
            if pressed:
                clickedBtn.setText("On")
                # set other variables you need
            else: 
                clickedBtn.setText("Off")
                # set other variables  
    
    btn2.clicked.connect(lambda: selftoggleLED(2))