Python PyQt5 Combobox Connection Inside Loop - PullRequest
0 голосов
/ 08 ноября 2019

Я пытаюсь перебрать все поля со списком и установить соответствующие метки на основе выбора поля со списком. Я могу перебрать код, настроив функцию для каждого соединения, но предпочел бы не делать этого, если в этом нет необходимости. У меня есть три поля (self.boxes) и три метки (self.units), которые я пытаюсь обновить элемент 1 с 1, 2 с 2, и 3 с 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('%')

1 Ответ

0 голосов
/ 08 ноября 2019

Самая большая проблема заключается в том, что вы присваиваете 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('%')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...