Как сделать так, чтобы в PyQt5 при нажатии на кнопку добавлялась ещё одна, при этом текст с нажатой кнопки переносился на новую?
Есть поле, забитое кнопками, при этом только одна из всех видна, и её текст - +.
Нужно сделать так, чтобы при нажатии на кнопку + появлялась следующая, при этом + должен переноситься на новую кнопку, а с нажатой стираться.
Я решил это делать следующим образом:
создал список всех кнопок, размещённых на QMainWindow, затем было, на мой взгляд, логичным сделать отбор с помощью for / in, а потом через if доделать задачу.
Но PyQt это вообще не устраивает, и он просто завершает работу Python.
class Message(QMainWindow, Ui_Message): # сообщения
def __init__(self, parent=None):
super(Message, self).__init__(parent)
self.setupUi(self)
self.setWindowTitle('Сообщения')
buttons= [pushButton, pushButton_2, pushButton_3, pushButton_4,
pushButton_5, pushButton_6, pushButton_7, pushButton_8,
pushButton_9, pushButton_10, pushButton_11, pushButton_12,
pushButton_13, pushButton_14, pushButton_15, pushButton_16,
pushButton_17, pushButton_18, pushButton_19, pushButton_20,
pushButton_21, pushButton_22, pushButton_23, pushButton_24]
for i in buttons:
if i.text() == "+":
self.i.setText(_translate("Message", "кнопка была нажата"))
self.i+1.setText(_translate("Message", "+"))
Ответы (1 шт):
Автор решения: S. Nick
→ Ссылка
Я увидел вашу задачу так:
import sys
from random import choices
from PyQt5.Qt import *
class Window(QWidget):
def __init__(self):
super().__init__()
self.btns = 24 # укажите количество кнопок
self.cols = 4 # укажите количество колонок
d = { k: v for k, v in [[f'{i}', f'Item{i}'] for i in range(self.btns)]}
lst = d
self._lst = [i for i in d]
self.groupBox = QGroupBox("Кнопка появлялась")
self.groupBox.setFlat(False)
self.groupBoxLayout = QGridLayout(self.groupBox)
self.groupBoxLayout.setContentsMargins(0, 0, 0, 0)
self.groupBoxLayout.setVerticalSpacing(1)
self.groupBoxLayout.setHorizontalSpacing(1)
layout = QVBoxLayout(self)
layout.addWidget(self.groupBox)
for i, v in enumerate(lst):
btn = QPushButton(v, objectName=v)
btn.setStyleSheet("font-size: 15px;")
btn.clicked.connect(self.toggle_checkbox)
self.groupBoxLayout.addWidget(btn, i//self.cols+1, i%self.cols+1)
self.groupBoxLayout.setRowStretch(0, 1)
self.groupBoxLayout.setRowStretch(i//self.cols+2, 1)
self.groupBoxLayout.setColumnStretch(0, 1)
self.groupBoxLayout.setColumnStretch(self.cols+1, 1)
self.choices_plus()
def choices_plus(self):
if not self._lst:
return
self.btn_plus = choices(self._lst)[0]
self._lst.pop(self._lst.index(self.btn_plus))
for i in range(self.groupBoxLayout.count()):
if self.groupBoxLayout.itemAt(i).widget().text() == self.btn_plus:
self.groupBoxLayout.itemAt(i).widget().setText('+')
self.groupBoxLayout.itemAt(i).widget().setStyleSheet('color: #f00')
def toggle_checkbox(self):
sender = self.sender()
if isinstance(sender, QPushButton):
if sender.text() == '+':
sender.setText('clicked')
sender.setStyleSheet('color: #fff')
self.choices_plus()
qss = '''
QPushButton {
background-color: #f4f9f9;
height: 60px;
width: 60px;
border: none;
}
QPushButton[text='+'] {
background-color: #0ff;
color: rgb(0, 0, 255);
font-size: 25px;
}
QPushButton[text='clicked'] {
background-color: #f14668;
font-size: 15px;
}
'''
if __name__ == '__main__':
app = QApplication(sys.argv)
app.setStyleSheet(qss)
ex = Window()
ex.show()
sys.exit(app.exec_())
