在PyQt PushButton单击期间发送其他变量

时间:2013-09-20 20:22:58

标签: python python-2.7 pyqt pyqt4

我是Python和PyQt的新手,这是我的第一个应用程序。目前,当点击按钮时,toggleLED()会检查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并记住它们的个别切换状态,那么最佳做法是什么?

我似乎也无法通过toggleLED()

btn.clicked.connect(self.toggleLED(btnNumber))传递额外的值
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
        btn2.clicked.connect(selftoggleLED(2))


    def toggleLED(self, pressed, value):

        source = self.sender()

        if self.LedOn:
            source.setText('Off')
            self.serial.write(value)
            self.serial.write('L')
        else:           
            source.setText('On')
            self.serial.write(value)
            self.serial.write('H')

5 个答案:

答案 0 :(得分:7)

您可以使用partial

from functools import partial

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

这允许您将多个参数传递给函数。

答案 1 :(得分:2)

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

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

阅读discussion of both methods

答案 2 :(得分:1)

以下是我一直用于此工作的解决方案。

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  

答案 3 :(得分:0)

QPushButton已经有checked布尔属性,因此您无需再创建另一个属性。按钮发出两个信号:

  1. clicked按下时
  2. toggled状态发生变化时
  3. 它们都传输参数,表示按钮的状态。但我认为,第二种更合适,因为它的名字。

    因此toggleLED广告位应如下所示:

    def toggleLED(self, checked):
        source = self.sender()
        if checked:
            source.setText('Off')
            self.serial.write('L')
        else:           
            source.setText('On')
            self.serial.write('H')
    

    请注意,只有可检查的按钮会发出toggled信号,但您已在代码中设置了此属性:

    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)
    

答案 4 :(得分:0)

class Screen(QWidget):

    def initUI(self):

        btn1 = QPushButton('Off', self)
        btn1.setCheckable(True)
        btn1.value = 1
        btn1.clicked.connect(selftoggleLED)

        btn2 = QPushButton('Off', self)
        btn2.setCheckable(True)
        btn2.value = 2
        btn2.clicked.connect(selftoggleLED)


    def toggleLED(self, pressed):

        source = self.sender()

        if pressed:
            source.setText('Off')
            self.serial.write(source.value)
            self.serial.write('L')
        else:           
            source.setText('On')
            self.serial.write(source.value)
            self.serial.write('H')
  1. 可检查的QPushButton将存储状态,因此您不需要 btn.LedOn
  2. 使用btn.value存储btn号码,因此您无需发送 额外的arg。