Stack Overflow на русском Asked by IceCube092 on December 30, 2021
self.button = QtWidgets.QPushButton(self)
self.button.setGeometry(10, 50, 280, 30)
self.button.setText(self.names["odds"]["button"])
self.menu = QtWidgets.QMenu(self.button)
self.button.setMenu(self.menu)
self.menu.clear()
self.stack = QtWidgets.QStackedWidget(self)
self.stack.setGeometry(10, 100, 280, 290)
labels_names = self.names["odds"]["labels"]
buttons = []
for value in values:
scroll = QtWidgets.QScrollArea()
self.stack.addWidget(scroll)
widget = QtWidgets.QWidget()
widget.setGeometry(0, 0, 240, 150)
scroll.setWidget(widget)
action = QtWidgets.QWidgetAction(self.button)
button = QtWidgets.QPushButton()
button.setText(str(value.pop("bookmaker")))
button.clicked.connect(
lambda: self.stack.setCurrentIndex(values.index(value)))
action.setDefaultWidget(button)
self.menu.addAction(action)
buttons.append(button)
index = 0
for name in labels_names:
val = value.get(name)
if val is not None:
label = QtWidgets.QLabel(widget)
label.setGeometry(10, 10 + 25 * index, 90, 25)
label.setText(str(name))
label.setAlignment(QtCore.Qt.AlignLeft)
label.setFont(self.font)
label_val = QtWidgets.QLabel(widget)
label_val.setGeometry(110, 10 + 25 * index, 120, 25)
label_val.setText(str(val))
label_val.setAlignment(QtCore.Qt.AlignRight)
label_val.setFont(self.font)
widget.setFixedHeight(50 + 25 * index)
index += 1
При таком коде при нажатии на все кнопки в выпадающем меню включается один и тот же виджет, причем последний. Не понимаю в чем дело, поскольку в лямбду передаются разные индексы. Если явно указывать числа (1,2,3) то все нормально и переключение работает, а при итерации по индексам – нет.
v = values.index(value)
button.clicked.connect(partial(self.stack.setCurrentIndex, v))
Вот так почему-то сработало
Answered by IceCube092 on December 30, 2021
Попробуйте так:
button.clicked.connect(
lambda _, value=value: self.stack.setCurrentIndex(values.index(value))
)
Я бы еще немного упростил код. Можно ведь сразу вести индекс значений values
, чтобы не запрашивать их через метод index
:
...
for i, value in enumerate(values):
...
button.clicked.connect(
lambda _, i=i: self.stack.setCurrentIndex(i)
)
# Или:
button.clicked.connect(partial(self.stack.setCurrentIndex, i))
Answered by gil9red on December 30, 2021
Get help from others!
Recent Questions
Recent Answers
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP