Python PyQt5组合框连接内部循环



我正在尝试循环浏览所有组合框,并根据组合框的选择设置相应的标签。我可以通过为每个连接设置一个函数来强行执行代码,但如果没有必要,我宁愿不这样做。我有三个框(self.boxes(和三个标签(self.units(,我试图用1更新元素1,用2更新元素2,用3更新元素3;然而,我的代码导致每个框的选择仅适用于第三个标签。以下是我当前代码的缩写版本:

import basic_GUI as gui    # basic_GUI.py is the auto-generated pyuic5 file
class MainUiClass(QtWidgets.QMainWindow, gui.Ui_MainWindow):
def __init__(self, parent=None):
super(MainUiClass, self).__init__(parent)
self.setupUi(self)

# Initialize variables
self.box = None
self.unit = None
self.DDitems = ['Dew Point','Mass Mixing Ratio','Relative Humidity']  # combobox listed items
self.boxes = [self.HumGenDDbox1, self.HumGenDDbox2, self.HumGenDDbox3]  # comboboxes
self.units = [self.HumGenUnits1, self.HumGenUnits2, self.HumGenUnits3]  # labels
self.addDDOptions()   # add options to dropdown boxes
self.updateDDBoxes()  # update labels for dropdown boxes
def addDDOptions(self):
for box in self.boxes:
box.addItems(self.DDitems)
def updateDDBoxes(self):
for self.box, self.unit in zip(self.boxes, self.units):
self.box.activated[str].connect(self.updateUnits)
def updateUnits(self, text):
if text == 'Dew Point':
self.unit.setText('°F')
elif text == 'Mass Mixing Ratio':
self.unit.setText('kgH2O/kgAir')
elif text == 'Relative Humidity':
self.unit.setText('%')

最大的问题是在for循环中分配self.boxself.unit,这不仅是错误的,而且会导致最终框和循环的单位对象被分配给这些属性名称。

为了保留对小部件的引用并确保函数更新正确的小部件,可以使用lambda作为连接目标小部件关键字参数,否则它将始终指向for循环分配给变量的最后一个对象。

def updateDDBoxes(self):
# this will not work as expected, since "unit" will always refer to
# the last object yielded in the for loop
#
# for box, unit in zip(self.boxes, self.units):
#     box.activated[str].connect(lambda text: self.updateUnits(text, unit))
# this ensures that the "unit" object is the correct one
for box, unit in zip(self.boxes, self.units):
box.activated[str].connect(
lambda text, unit=unit: self.updateUnits(text, unit))
def updateUnits(self, text, unit):
if text == 'Dew Point':
unit.setText('°F')
elif text == 'Mass Mixing Ratio':
unit.setText('kgH2O/kgAir')
elif text == 'Relative Humidity':
unit.setText('%')

最新更新