4

我是 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()withbtn.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')
4

5 回答 5

7

您可以partial为此使用:

from functools import partial

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

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

于 2013-09-20T23:37:46.150 回答
3

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

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

阅读这两种方法的讨论

于 2014-10-03T18:20:46.373 回答
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  
于 2013-09-29T08:28:52.447 回答
0

QPushButton确实已经有checked布尔属性,所以你不需要创建另一个。按钮会发出两个信号:

  1. clicked当它被按下时
  2. toggled当它的状态改变时

它们都传递指示按钮状态的参数。但我认为,第二个更合适,因为它的名字。

所以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)
于 2013-09-22T14:39:21.377 回答
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。
于 2013-09-23T02:34:30.903 回答