[pyar] Problemita con lambda
Andrés Gattinoni
andresgattinoni en gmail.com
Lun Ene 17 22:44:59 ART 2011
Tengo este código en dentro de una clase (una ventana de PyQT):
def set_category (self, id):
print "Setting category id ", id
task = self.taskList.currentItem().task
task.category = id
self.backend.save_task(task)
self._load_categories()
def on_taskList_customContextMenuRequested(self, point):
"""Displayes the context menu for a task"""
# Context menu
menu = QtGui.QMenu(self)
# Actions
menu.addAction('Notes...', self.add_note)
menu.addSeparator()
menu.addAction('Edit task')
menu.addAction('Delete task', self.confirm_delete)
menu.addSeparator()
# Categories sub-menu
categories = QtGui.QMenu('Change category', menu)
categoryList = self.backend.get_categories()
if len(categoryList) > 1:
categoryList.pop(0) # discard the 'All' category
for item in categoryList:
categories.addAction(item.name, lambda:
self.set_category(item.id))
categories.addSeparator()
categories.addAction('New category...', self.add_category)
menu.addMenu(categories)
# Show the menu
menu.exec_(QtGui.QCursor().pos())
El método on_taskList_customContextMenuRequested se llama cuando
alguien hace click derecho en un elemento de un QTreeWidget y muestra
un menú contextual (QMenu).
Dentro de ese menú hay un submenú con el título "Change category",
dentro del cual hay una serie de categorías. Cuando hacés click en una
categoría se debe llamar al método set_category para cambiarle la
categoría al item.
Para poder pasarle el ID de la categoría al método set_category estoy
usando lambda, con la idea de asignarle como callback del QAction un
closure que contenga el ID de la categoría correspondiente.
Lo que estoy viendo es que cuando corro el programa, la primera vez
que defino una categoría para un item funciona bien. Pero cuando
quiero categorizar un segundo ítem, me vuelve a pasar el mismo ID de
categoría al método set_category.
Evidentemente hay algo que se me escapa. Qué puede ser? Lo del lambda
está bien? Quizás tengo mal el concepto. Hay alguna otra forma de
pasarle el valor de item.id como valor al callback de QAction?
More information about the pyar
mailing list