Удалить кнопки с формы
В окне есть блок кнопок с рандомными названиями.
При нажатии на кнопку "Х" нужно удалить только эти кнопки, а все остальные кнопки и элементы формы должны остаться на экране.
Логика подсказывает, что нужно такие кнопки (которые надо удлать) объединить через общий идентификатор, а потом удалять кнопки, у которых на форме этот идентификатор установлен.
Вот только как это сделать я не могу понять.
Небольшой пример:
import sys
import random
from PyQt5 import QtWidgets
from PyQt5.QtWidgets import *
class MainWindow(QtWidgets.QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("Пример")
buttons = [str(random.randint(0,100)), str(random.randint(0,100)), str(random.randint(0,100)), str(random.randint(0,100))]
x = 10
y = 0
#Блок кнопок, которые надо удалить по нажатию на кнопку "Х"
for button in buttons:
y = y + 25
btn = QPushButton(button, self)
btn.move(x, y)
btn.setToolTip(button)
btn.resize(btn.sizeHint())
# Кнопки, которые должны остаться после нажатия на "Х"
btn = QPushButton("Эта кнопка должна остаться", self)
btn.move(100, 40)
btn = QPushButton("И эта кнопка должна остаться", self)
btn.move(100, 80)
btn = QPushButton("Х", self)
btn.move(100, 10)
btn.clicked.connect(self.delete)
def delete(self):
reply = QMessageBox.question(self, 'Message', "Вы действительно хотите удалить?", QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
print("Да" if reply == QMessageBox.Yes else "Нет")
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
w.show()
sys.exit(app.exec_())
На экране появляется окно и в нем, при нажатии на Х, нужно удалить только кнопки с рандомными названиями (в моем примере, это случайные числа), а все остальное оставить на месте.
Ответы (2 шт):
Автор решения: n1tr0xs
→ Ссылка
Вот так можно:
import sys
import random
from PyQt5 import QtWidgets
from PyQt5.QtWidgets import *
class MainWindow(QtWidgets.QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("Пример")
# -----------------------------
button_names = [str(random.randint(0,100)), str(random.randint(0,100)), str(random.randint(0,100)), str(random.randint(0,100))]
self.buttons = []
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
x = 10
y = 0
#Блок кнопок, которые надо удалить по нажатию на кнопку "Х"
for name in button_names: # <-----
y = y + 25
btn = QPushButton(name, self)
btn.move(x, y)
btn.setToolTip(name)
btn.resize(btn.sizeHint())
self.buttons.append(btn) # <-----
# Кнопки, которые должны остаться после нажатия на "Х"
btn = QPushButton("Эта кнопка должна остаться", self)
btn.move(100, 40)
btn = QPushButton("И эта кнопка должна остаться", self)
btn.move(100, 80)
btn = QPushButton("Х", self)
btn.move(100, 10)
btn.clicked.connect(self.delete)
def delete(self):
reply = QMessageBox.question(self, 'Message', "Вы действительно хотите удалить?", QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
print("Да" if reply == QMessageBox.Yes else "Нет")
# --------------------------
if reply == QMessageBox.Yes:
for btn in self.buttons:
btn.hide()
# ^^^^^^^^^^^^^^^^^^^^^^^^^^
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
w.show()
sys.exit(app.exec_())
Автор решения: S. Nick
→ Ссылка
я увидел вашу задачу так:
import sys
import random
from PyQt5 import QtWidgets
from PyQt5.QtWidgets import *
class MainWindow(QtWidgets.QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("Пример")
self.centralWidget = QWidget(self) # !!!
self.setCentralWidget(self.centralWidget) # !!!
self.addButtons() # +++
# Кнопки, которые должны остаться после нажатия на "Х"
btn = QPushButton("Эта кнопка должна остаться", self.centralWidget)
btn.move(100, 40)
btn = QPushButton("И эта кнопка должна остаться", self.centralWidget)
btn.move(100, 80)
self.btn_add_delete = QPushButton("Delete", self.centralWidget) # self.centralWidget
self.btn_add_delete.move(100, 10)
self.btn_add_delete.clicked.connect(self.deleteButtons)
def addButtons(self):
self.buttons = [
QPushButton(str(random.randint(0,100))),
QPushButton(str(random.randint(0,100))),
QPushButton(str(random.randint(0,100))),
QPushButton(str(random.randint(0,100)))
]
x = 10
y = 0
#Блок кнопок, которые надо удалить по нажатию на кнопку "Delete"
for button in self.buttons:
y = y + 25
btn = button
btn.setParent(self.centralWidget)
btn.move(x, y)
btn.setToolTip(button.text())
btn.resize(btn.sizeHint())
btn.show()
def deleteButtons(self):
if self.btn_add_delete.text() == "Delete":
reply = QMessageBox.question(
self,
'Message', "Вы действительно хотите удалить?",
QMessageBox.Yes | QMessageBox.No,
QMessageBox.No
)
if reply == QMessageBox.Yes:
print("Да <<-----")
for button in self.buttons:
button.hide()
self.btn_add_delete.setText("Add")
elif self.btn_add_delete.text() == "Add":
self.addButtons()
self.btn_add_delete.setText("Delete")
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
w.resize(400, 200)
w.show()
sys.exit(app.exec_())


