我是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')
答案 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))
答案 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
布尔属性,因此您无需再创建另一个属性。按钮发出两个信号:
clicked
按下时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)
答案 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')
btn.LedOn
。 btn.value
存储btn号码,因此您无需发送
额外的arg。