[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