Почему список не добавляется, а перезаписывается вместо этого?

#python #list #pyqt4

#python #Список #pyqt4

Вопрос:

Я создал макет с помощью PyQt4. Я хочу обновить свой QListView сетями, введенными в полях QLineEdit (lineNetworkId) и (lineMask).

Но также я хочу иметь обновленный список, который включает все эти введенные сети для дальнейшей настройки.

Мой QListView показывает сети в графическом интерфейсе после нажатия кнопки addButton, это работает, но мой дополнительный список (bgp) перезаписывается каждый раз.

 class Ui_MainWindow(object):
    def setupUi(self, MainWindow):

        self.addButton.clicked.connect(System.addItem)


class System:

    def addItem(self):
        networks = {}
        bgp = []

        network = ui.lineNetworkId.text()
        mask = ui.lineMask.text()

        networks.update({network:mask})
        ui.listWidget.addItem(str("network {} mask {}".format(network, mask)))
        ui.lineNetworkId.clear()
        ui.lineMask.clear()

        for key, value in networks.items():
            bgp_add = 'network {0} mask {1}'.format(key, value)
            bgp.append(bgp_add)

        bgp_network = 'n  '.join(bgp)

        print(bgp)
        print(networks)
        print(ui.listWidget)

if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    MainWindow = QtGui.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

OUTPUT:
['network 1 mask 1']
{'1': '1'}
<PyQt4.QtGui.QListWidget object at 0x0656C350>
['network 2 mask 2']
{'2': '2'}
<PyQt4.QtGui.QListWidget object at 0x0656C350>
  

Комментарии:

1. 9.3.5. Переменные класса и экземпляра

Ответ №1:

каждый раз, когда нажимается кнопка, вы вызываете функцию addItem:

 self.addButton.clicked.connect(System.addItem)
  

это нормально, но каждый раз, когда вы вызываете функцию, вы определяете пустой список: bgp = []

     def addItem(self):
        networks = {}
        bgp = []
  

вы должны определить свой bgp из функции addItem (self), например :

 class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        self.bgp = []
        self.addButton.clicked.connect(System.addItem)

class System:
   def addItem(self):
       ...
       for key, value in networks.items():
           bgp_add = 'network {0} mask {1}'.format(key, value)
           Ui_MainWindow.bgp.append(bgp_add)
  

Комментарии:

1. спасибо за ваш ответ, я уже думал, что эта проблема должна быть связана с чем-то подобным. Я попробовал это, но получил следующую ошибку: Ошибка: Трассировка (последний последний вызов): Файл «C: «, строка 265, в addItem self.bgp.append(bgp_add) Ошибка атрибута: объект ‘bool’ не имеет атрибута ‘bgp’ «‘класс Ui_MainWindow(object): def setupUi(self, MainWindow): self.addButton.clicked.connect(System.addItem) self.bgp = []

2. ПРИМЕЧАНИЕ: в системе классов вам нужно использовать bgp, такой как Ui_MainWindow.bgp.append(bgp_add), потому что bgp определен в классе Ui_MainWindow @Maximilian

3. ui.bgp.append(bgp_add) сработал для меня, большое вам спасибо. 🙂