分配多个滑块回调的 Pythonic 方式(PyQt)?
Pythonic way to assign multiple slider callbacks (PyQt)?
我正在寻找一种更 pythonic 的方式来将回调函数连接到我正在编写的基于 PyQt 的 GUI 上的多个滑块。必须有更好的方法来做到这一点!与此相关的是,有没有一种方法可以使用字典来迭代调用对象的方法?假设我想迭代地获取每个滑块的值?提前致谢。
我想压缩(和 pythonify!)的代码:
self.ui.seg1Slider.valueChanged.connect(lambda value,segment='1': self.sliderMoved(value,segment))
self.ui.seg2Slider.valueChanged.connect(lambda value,segment='2': self.sliderMoved(value,segment))
self.ui.seg3Slider.valueChanged.connect(lambda value,segment='3': self.sliderMoved(value,segment))
self.ui.seg4Slider.valueChanged.connect(lambda value,segment='4': self.sliderMoved(value,segment))
self.ui.seg5Slider.valueChanged.connect(lambda value,segment='5': self.sliderMoved(value,segment))
self.ui.seg6Slider.valueChanged.connect(lambda value,segment='6': self.sliderMoved(value,segment))
self.ui.seg7Slider.valueChanged.connect(lambda value,segment='7': self.sliderMoved(value,segment))
self.ui.seg8Slider.valueChanged.connect(lambda value,segment='8': self.sliderMoved(value,segment))
self.ui.seg10Slider.valueChanged.connect(lambda value,segment='10': self.sliderMoved(value,segment))
self.ui.seg11Slider.valueChanged.connect(lambda value,segment='11': self.sliderMoved(value,segment))
self.ui.seg12Slider.valueChanged.connect(lambda value,segment='12': self.sliderMoved(value,segment))
self.ui.seg13Slider.valueChanged.connect(lambda value,segment='13': self.sliderMoved(value,segment))
self.ui.seg14Slider.valueChanged.connect(lambda value,segment='14': self.sliderMoved(value,segment))
self.ui.seg15Slider.valueChanged.connect(lambda value,segment='15': self.sliderMoved(value,segment))
self.ui.seg17Slider.valueChanged.connect(lambda value,segment='17': self.sliderMoved(value,segment))
self.ui.seg18Slider.valueChanged.connect(lambda value,segment='18': self.sliderMoved(value,segment))
self.ui.seg19Slider.valueChanged.connect(lambda value,segment='19': self.sliderMoved(value,segment))
self.ui.seg20Slider.valueChanged.connect(lambda value,segment='20': self.sliderMoved(value,segment))
self.ui.seg21Slider.valueChanged.connect(lambda value,segment='21': self.sliderMoved(value,segment))
self.ui.seg22Slider.valueChanged.connect(lambda value,segment='22': self.sliderMoved(value,segment))
self.ui.seg23Slider.valueChanged.connect(lambda value,segment='23': self.sliderMoved(value,segment))
self.ui.seg24Slider.valueChanged.connect(lambda value,segment='24': self.sliderMoved(value,segment))
self.ui.seg25Slider.valueChanged.connect(lambda value,segment='25': self.sliderMoved(value,segment))
self.ui.seg26Slider.valueChanged.connect(lambda value,segment='26': self.sliderMoved(value,segment))
self.ui.seg27Slider.valueChanged.connect(lambda value,segment='27': self.sliderMoved(value,segment))
self.ui.seg28Slider.valueChanged.connect(lambda value,segment='28': self.sliderMoved(value,segment))
self.ui.seg29Slider.valueChanged.connect(lambda value,segment='29': self.sliderMoved(value,segment))
self.ui.seg30Slider.valueChanged.connect(lambda value,segment='30': self.sliderMoved(value,segment))
self.ui.seg31Slider.valueChanged.connect(lambda value,segment='31': self.sliderMoved(value,segment))
self.ui.seg32Slider.valueChanged.connect(lambda value,segment='32': self.sliderMoved(value,segment))
使用 getattr
的循环会起作用,但您似乎没有完整的数字范围(缺少 9 和 16),因此您也需要考虑到这一点:
for segment in range(1, 33):
if segment == 9 or segment == 16:
continue
slider = getattr(self.ui, 'seg%dSlider' % segment)
slider.valueChanged.connect(
lambda value, segment=str(segment): self.sliderMoved(value, segment))
但是,可能会有更简洁的解决方案,因为看起来您正在使用 Qt Designer 创建 GUI。这意味着滑块将全部获得匹配其属性名称的 object names。如果您还确保所有滑块都放在容器小部件中,那么您将能够执行如下操作:
for slider in self.ui.sliderContainer.findChildren(QtGui.QSlider):
segment = slider.objectName()[3:][:-6]
slider.valueChanged.connect(
lambda value, segment=segment: self.sliderMoved(value, segment))
这比以前的解决方案更健壮,因为只要您使用相同的命名格式,您就可以在 Qt Designer 中安全地添加或删除滑块,而无需更新此代码。
(PS: 也可以find children with object-names that match a given QRegExp).
我正在寻找一种更 pythonic 的方式来将回调函数连接到我正在编写的基于 PyQt 的 GUI 上的多个滑块。必须有更好的方法来做到这一点!与此相关的是,有没有一种方法可以使用字典来迭代调用对象的方法?假设我想迭代地获取每个滑块的值?提前致谢。
我想压缩(和 pythonify!)的代码:
self.ui.seg1Slider.valueChanged.connect(lambda value,segment='1': self.sliderMoved(value,segment))
self.ui.seg2Slider.valueChanged.connect(lambda value,segment='2': self.sliderMoved(value,segment))
self.ui.seg3Slider.valueChanged.connect(lambda value,segment='3': self.sliderMoved(value,segment))
self.ui.seg4Slider.valueChanged.connect(lambda value,segment='4': self.sliderMoved(value,segment))
self.ui.seg5Slider.valueChanged.connect(lambda value,segment='5': self.sliderMoved(value,segment))
self.ui.seg6Slider.valueChanged.connect(lambda value,segment='6': self.sliderMoved(value,segment))
self.ui.seg7Slider.valueChanged.connect(lambda value,segment='7': self.sliderMoved(value,segment))
self.ui.seg8Slider.valueChanged.connect(lambda value,segment='8': self.sliderMoved(value,segment))
self.ui.seg10Slider.valueChanged.connect(lambda value,segment='10': self.sliderMoved(value,segment))
self.ui.seg11Slider.valueChanged.connect(lambda value,segment='11': self.sliderMoved(value,segment))
self.ui.seg12Slider.valueChanged.connect(lambda value,segment='12': self.sliderMoved(value,segment))
self.ui.seg13Slider.valueChanged.connect(lambda value,segment='13': self.sliderMoved(value,segment))
self.ui.seg14Slider.valueChanged.connect(lambda value,segment='14': self.sliderMoved(value,segment))
self.ui.seg15Slider.valueChanged.connect(lambda value,segment='15': self.sliderMoved(value,segment))
self.ui.seg17Slider.valueChanged.connect(lambda value,segment='17': self.sliderMoved(value,segment))
self.ui.seg18Slider.valueChanged.connect(lambda value,segment='18': self.sliderMoved(value,segment))
self.ui.seg19Slider.valueChanged.connect(lambda value,segment='19': self.sliderMoved(value,segment))
self.ui.seg20Slider.valueChanged.connect(lambda value,segment='20': self.sliderMoved(value,segment))
self.ui.seg21Slider.valueChanged.connect(lambda value,segment='21': self.sliderMoved(value,segment))
self.ui.seg22Slider.valueChanged.connect(lambda value,segment='22': self.sliderMoved(value,segment))
self.ui.seg23Slider.valueChanged.connect(lambda value,segment='23': self.sliderMoved(value,segment))
self.ui.seg24Slider.valueChanged.connect(lambda value,segment='24': self.sliderMoved(value,segment))
self.ui.seg25Slider.valueChanged.connect(lambda value,segment='25': self.sliderMoved(value,segment))
self.ui.seg26Slider.valueChanged.connect(lambda value,segment='26': self.sliderMoved(value,segment))
self.ui.seg27Slider.valueChanged.connect(lambda value,segment='27': self.sliderMoved(value,segment))
self.ui.seg28Slider.valueChanged.connect(lambda value,segment='28': self.sliderMoved(value,segment))
self.ui.seg29Slider.valueChanged.connect(lambda value,segment='29': self.sliderMoved(value,segment))
self.ui.seg30Slider.valueChanged.connect(lambda value,segment='30': self.sliderMoved(value,segment))
self.ui.seg31Slider.valueChanged.connect(lambda value,segment='31': self.sliderMoved(value,segment))
self.ui.seg32Slider.valueChanged.connect(lambda value,segment='32': self.sliderMoved(value,segment))
使用 getattr
的循环会起作用,但您似乎没有完整的数字范围(缺少 9 和 16),因此您也需要考虑到这一点:
for segment in range(1, 33):
if segment == 9 or segment == 16:
continue
slider = getattr(self.ui, 'seg%dSlider' % segment)
slider.valueChanged.connect(
lambda value, segment=str(segment): self.sliderMoved(value, segment))
但是,可能会有更简洁的解决方案,因为看起来您正在使用 Qt Designer 创建 GUI。这意味着滑块将全部获得匹配其属性名称的 object names。如果您还确保所有滑块都放在容器小部件中,那么您将能够执行如下操作:
for slider in self.ui.sliderContainer.findChildren(QtGui.QSlider):
segment = slider.objectName()[3:][:-6]
slider.valueChanged.connect(
lambda value, segment=segment: self.sliderMoved(value, segment))
这比以前的解决方案更健壮,因为只要您使用相同的命名格式,您就可以在 Qt Designer 中安全地添加或删除滑块,而无需更新此代码。
(PS: 也可以find children with object-names that match a given QRegExp).