Самая большая проблема заключается в том, что вы присваиваете self.box
и self.unit
в цикле for, что не только неверно, но приводит к тому, что блоку final и единицам объекта цикла назначаетсяимена этих атрибутов.
Чтобы сохранить ссылку на виджеты и убедиться, что функция обновляет правильное значение, можно использовать лямбду для соединения с целевым виджетом в качестве аргумента ключевого слова , в противном случае он всегда будет указывать на последний объект, который цикл 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('%')