Форум сайта python.su
Добрый день!
Так уж вышло что у меня есть список, количество элементов которого я не знаю, с помощью PyQt5 создаю виджет через цикл for: Список, spinbox, pushButton
Если упрощенно, то выглядит это так. Неважно какой это список и куда он будет вставляться:
layout_main = QtWidgets.QVBoxLayout() for item in SPISOK: layout_item = QtWidgets.QHBoxLayout() #создаю лэйбл label = QtWidgets.QLabel() label.setText(item) #создаю спинбокс spin = QtWidgets.QSpinBox() spin.setButtonSymbols(QtWidgets.QAbstractSpinBox.NoButtons) spin.setFocusPolicy(Qt.ClickFocus) spin.setAlignment(Qt.AlignHCenter) spin.setMaximum(99) spin.setValue(1) spin.setMinimumSize(31, 21) spin.setMaximumSize(31, 21) #создаю кнопку but = QtWidgets.QPushButton() but.setMinimumSize(21, 21) but.setMaximumSize(21, 21) but.setText("✓") but.setFont(QtGui.QFont("Times", 10, QtGui.QFont.Bold)) but.clicked.connect(lambda: print(spin.value(), item)) #распихиваю по лайаутам layout_item.addWidget(label) layout_item.addWidget(spin) layout_item.addWidget(but) layout_main.addItem(layout_item)
Офлайн
TempПопробуй так сделатьbut.clicked.connect(lambda: print(spin.value(), item))
but.clicked.connect((lambda a, b: print(a, b))(spin.value(), item))
Офлайн
> Так уж вышло что у меня есть список, количество элементов которого я не знаю, с помощью PyQt5 создаю виджет через цикл for: Список, spinbox, pushButton
Если хочешь сделать хорошо, то думай над тем как всё это засунуть в QTableView или что то подобное
> что бы я не делал она выдает не дает связку кнопка->спинбокс, нажатие любой кнопки выдает и spin.value(), и item из последней добавленной итерации
Это вообще детская ошибка. connect отрабатывает не когда он был вызван, а когда освободится поток, а он освободится когда завершится цикл и все виджеты будут установлены. Поскольку в переменных spin и but содержатся ссылки только на последние виджеты, то только они и будут подключены.
Попробуй как то так:
widget_list = [] for item in SPISOK: .... widget_list.append((but, spin)) for x in range(len(widget_list)): widget_list[x][0].clicked.connect(lambda: print(widget_list[x][1].value()))
Офлайн
Rodegast
> connect отрабатывает не когда он был вызван, а когда освободится поток, а он освободится когда завершится цикл и все виджеты будут установлены.
widgets = [[],[],[]] layout_main = QtWidgets.QVBoxLayout() for item in SPISOK: layout_item = QtWidgets.QHBoxLayout() #создаю лэйбл label = QtWidgets.QLabel() label.setText(item) #создаю спинбокс spin = QtWidgets.QSpinBox() spin.setButtonSymbols(QtWidgets.QAbstractSpinBox.NoButtons) spin.setFocusPolicy(Qt.ClickFocus) spin.setAlignment(Qt.AlignHCenter) spin.setMaximum(99) spin.setValue(1) spin.setMinimumSize(31, 21) spin.setMaximumSize(31, 21) #создаю кнопку but = QtWidgets.QPushButton() but.setMinimumSize(21, 21) but.setMaximumSize(21, 21) but.setText("✓") but.setFont(QtGui.QFont("Times", 10, QtGui.QFont.Bold)) widgets[0].append(but) widgets[1].append(spin) widgets[2].append(item) #распихиваю по лайаутам layout_item.addWidget(label) layout_item.addWidget(spin) layout_item.addWidget(but) layout_main.addItem(layout_item) for button, spinbox, name in zip(widgets[0],widgets[1],widgets[2]): button.clicked.connect(lambda: print(spinbox.value(), name))
Офлайн
py.user.nextpython ошибку выдает
Офлайн
> Так я тоже делал, пихал все в массив и опять же тем же циклом for отдельно все пытался коннектить.
Смысл того что я написал не в наличии второго цикла, а в отсутствии переменных
Офлайн
TempЯ вот это проверил, всё работает
python ошибку выдает
but.clicked.connect((lambda a, b: lambda: print(a.value(), b))(spin, item))
Офлайн