Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 24, 2023 12:20:24

Temp
Зарегистрирован: 2021-01-16
Сообщения: 75
Репутация: +  1  -
Профиль   Отправить e-mail  

PyQt5 - кривой connect

Добрый день!

Так уж вышло что у меня есть список, количество элементов которого я не знаю, с помощью 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, как это решается?

Офлайн

#2 Апрель 24, 2023 17:43:17

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9844
Репутация: +  853  -
Профиль   Отправить e-mail  

PyQt5 - кривой connect

Temp
 but.clicked.connect(lambda: print(spin.value(), item))
Попробуй так сделать
  
but.clicked.connect((lambda a, b: print(a, b))(spin.value(), item))



Офлайн

#3 Апрель 24, 2023 23:09:25

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2740
Репутация: +  183  -
Профиль   Отправить e-mail  

PyQt5 - кривой connect

> Так уж вышло что у меня есть список, количество элементов которого я не знаю, с помощью 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()))



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#4 Апрель 25, 2023 12:42:38

Temp
Зарегистрирован: 2021-01-16
Сообщения: 75
Репутация: +  1  -
Профиль   Отправить e-mail  

PyQt5 - кривой connect

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 вообще неадекватно работает всегда…

Офлайн

#5 Апрель 25, 2023 12:47:41

Temp
Зарегистрирован: 2021-01-16
Сообщения: 75
Репутация: +  1  -
Профиль   Отправить e-mail  

PyQt5 - кривой connect

py.user.next
python ошибку выдает

Офлайн

#6 Апрель 25, 2023 13:12:18

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2740
Репутация: +  183  -
Профиль   Отправить e-mail  

PyQt5 - кривой connect

> Так я тоже делал, пихал все в массив и опять же тем же циклом for отдельно все пытался коннектить.

Смысл того что я написал не в наличии второго цикла, а в отсутствии переменных



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#7 Апрель 25, 2023 13:58:48

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9844
Репутация: +  853  -
Профиль   Отправить e-mail  

PyQt5 - кривой connect

Temp
python ошибку выдает
Я вот это проверил, всё работает
  
but.clicked.connect((lambda a, b: lambda: print(a.value(), b))(spin, item))



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version