我在PyQt中使用for loop
连接多个信号/插槽。代码如下:
# Connect Scan Callbacks
for button in ['phase', 'etalon', 'mirror', 'gain']:
getattr(self.ui, '{}_scan_button' .format(button)).clicked.connect(
lambda: self.scan_callback(button))
我的期望:
连接按钮
phase_scan_button
单击signal
到scan_callback
slot
并将字符串phase
作为参数发送到slot
。 etalon
,mirror
和gain
相同。我得到的是:
由于某些原因,我的函数总是将字符串
gain
作为所有按钮的参数传递。不知道我是不是很愚蠢(可能是)或它是一个错误。作为参考,
slot
方法:def scan_callback(self, scan):
print(scan) # Here I always get 'gain'
if self.scanner.isWorking:
self.scanner.isWorking = False
self.scan_thread.terminate()
self.scan_thread.wait()
else:
self.scanner.isWorking = True
self.scan_thread.start()
getattr(self.ui, '{}_scan_button' .format(
scan)).setText('Stop Scan')
getattr(self, '_signal{}Scan' .format(scan)).emit()
最佳答案
在pyqt中迭代几个小部件的首选方式是将它们作为对象存储在列表中。
myButtons = [self.ui.phase_scan_button, self.ui.etalon_scan_button,
self.ui.mirror_scan_button, self.ui.gain_scan_button]
for button in myButtons:
button.clicked.connect(lambda _, b=button: self.scan_callback(scan=b))
如果您需要分别使用字符串“ phase”,“ etalon”,“ mirror”和“ gain”,则可以将它们存储在另一个列表中,也可以创建一个字典,例如
myButtons_dict = {"phase": self.ui.phase_scan_button,
"etalon": self.ui.etalon_scan_button,
"mirror": self.ui.mirror_scan_button,
"gain": self.ui.gain_scan_button}
for button in myButtons_dict:
myButtons_dict[button].clicked.connect(lambda: _, b=button self.scan_callback(scan=b))
请注意,我如何将lambda表达式与实体变量一起使用,然后将其传递到函数
self.scan_callback
中。这样,button
的值将被永久存储。