Найти - Пользователи
Полная версия: PyQt5 - кривой connect
Начало » Python для новичков » PyQt5 - кривой connect
1
Temp
Добрый день!

Так уж вышло что у меня есть список, количество элементов которого я не знаю, с помощью 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)
Проблема заключается в connect-функции кнопок, что бы я не делал она выдает не дает связку кнопка->спинбокс, нажатие любой кнопки выдает и spin.value(), и item из последней добавленной итерации for, как это решается?
py.user.next
Temp
 but.clicked.connect(lambda: print(spin.value(), item))
Попробуй так сделать
  
but.clicked.connect((lambda a, b: print(a, b))(spin.value(), item))
Rodegast
> Так уж вышло что у меня есть список, количество элементов которого я не знаю, с помощью 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()))
Temp
Rodegast
> connect отрабатывает не когда он был вызван, а когда освободится поток, а он освободится когда завершится цикл и все виджеты будут установлены.

Так я тоже делал, пихал все в массив и опять же тем же циклом for отдельно все пытался коннектить. Спойлер: всё тоже самое

 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))
Мне кажется что connect в цикле for вообще неадекватно работает всегда…
Temp
py.user.next
python ошибку выдает
Rodegast
> Так я тоже делал, пихал все в массив и опять же тем же циклом for отдельно все пытался коннектить.

Смысл того что я написал не в наличии второго цикла, а в отсутствии переменных
py.user.next
Temp
python ошибку выдает
Я вот это проверил, всё работает
  
but.clicked.connect((lambda a, b: lambda: print(a.value(), b))(spin, item))
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB