#python #python-3.x #pyqt5
Вопрос:
Я пишу программу, в которой есть список текущих задач. Упрощенная версия выглядит примерно так:
Затем я нажимаю кнопку добавить, чтобы добавить задачу к другой, а затем нажимаю X, чтобы удалить задачу. Я не настолько продвинут в программировании и не могу понять, как это сделать правильно. Код выглядит так:
import sys
from PyQt5.QtWidgets import (
QApplication,
QGridLayout,
QLineEdit,
QPushButton,
QVBoxLayout,
QWidget,
QLabel)
class App(QWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.taskList = ['Some text 1', 'Some text 2', 'some text 3']
self.initUI()
def initUI(self):
self.title = 'Task list'
self.main_layout = QVBoxLayout()
self.grid = QGridLayout()
self.input_field = QLineEdit()
self.add = QPushButton('add')
self.add.clicked.connect(self.addTask)
self.grid.addWidget(self.input_field, 0, 0)
self.grid.addWidget(self.add, 0, 1)
self.showTasks()
self.main_layout.addLayout(self.grid)
self.main_layout.addStretch()
self.setLayout(self.main_layout)
self.setWindowTitle(self.title)
self.resize(300, 100)
self.show()
def showTasks(self):
row = 2
col = 0
for task in self.taskList:
task_label = QLabel(task)
task_button = QPushButton('X')
task_button.clicked.connect(
lambda: self.removeTask(task_label.text()))
self.grid.addWidget(task_label, row, col, 1, 1)
self.grid.addWidget(task_button, row, col 1, 1, 1)
row = 1
def addTask(self):
task = self.input_field.text()
if task:
self.taskList.append(task)
self.update()
def removeTask(self, task):
self.taskList.remove(task)
self.update()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = App()
sys.exit(app.exec_())
Комментарии:
1.Как ваш
list
список задач связан с элементами пользовательского интерфейса (меткой и кнопкой)? Есть ли вообще какая-то связь? Что вы собираетесь делатьself.update()
? Разве вы не хотели вызвать функциюshowTasks()
?
Ответ №1:
Возможное решение состоит в том, чтобы отобразить кнопки и метки в словаре, получить кнопку с помощью метода отправителя, а затем удалить их с помощью deleteLater.
class App(QWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.taskList = ["Some text 1", "Some text 2", "some text 3"]
self.initUI()
def initUI(self):
self.title = "Task list"
self.main_layout = QVBoxLayout()
self.grid = QGridLayout()
self.input_field = QLineEdit()
self.add = QPushButton("add")
self.add.clicked.connect(self.handle_add_clicked)
self.grid.addWidget(self.input_field, 0, 0)
self.grid.addWidget(self.add, 0, 1)
self.mapping_widget = {}
self.showTasks()
self.main_layout.addLayout(self.grid)
self.main_layout.addStretch()
self.setLayout(self.main_layout)
self.setWindowTitle(self.title)
self.resize(300, 100)
self.show()
def add_task(self, task):
row = self.grid.rowCount()
task_label = QLabel(task)
task_button = QPushButton("X")
task_button.clicked.connect(self.handle_delete_clicked)
self.grid.addWidget(task_label, row, 0)
self.grid.addWidget(task_button, row, 1)
self.mapping_widget[task_button] = task_label
def showTasks(self):
for task in self.taskList:
self.add_task(task)
def handle_add_clicked(self):
task = self.input_field.text()
self.add_task(task)
def handle_delete_clicked(self):
button = self.sender()
if not isinstance(button, QPushButton):
return
label = self.mapping_widget.get(button)
if label is None:
return
del self.mapping_widget[button]
button.deleteLater()
label.deleteLater()