[PyQt] Problem sometimes connecting signal/slot in a loop

Sebastian Schleehauf slepton at posteo.de
Sun May 19 10:36:29 BST 2019


In the past I have used the following approach which does the trick
quite well by using a dict containing instances and colors instead of a
list with colors. With self.sender() one can obtain the corresponding
color. A functional example can be found below. 
Since the question has been solved allready, I am sending this to find
out if my approach can be considerd "good" and if it has any side
effect I am currently not aware of....
import sys

from PyQt5.QtCore import pyqtSlot
from PyQt5.QtGui import QColor
from PyQt5.QtWidgets import QWidget, QPushButton, QColorDialog,
QApplication, QVBoxLayout


class ButtonColorWidget(QWidget):
    def __init__(self, parent=None):
        super().__init__(parent=parent)
        self.layout = QVBoxLayout()
        self.setLayout(self.layout)
        # Create  some sample buttons with color mapping
        self.button_color_dict = dict()
        for n in range(4):
            button = QPushButton('Button ' + str(n))
            self.button_color_dict[button] = QColor('black')  #
initial_color
            self.layout.addWidget(button)
            button.clicked.connect(self.start_dialog)
        # ColorDialog
        self.color_dialog = QColorDialog(self)

    @pyqtSlot()
    def start_dialog(self):
        button = self.sender()
        if button is None:
            print('Directly calling this method is ignored...')
            return
        new_color =
self.color_dialog.getColor(self.button_color_dict[button])

        if new_color.isValid():
            button.setStyleSheet('QPushButton{color: ' +
new_color.name()+'};')
            self.button_color_dict[button] = new_color
            print('Set new color ', new_color.name())
        else:
            print('Aborted...')
        return


application = QApplication(sys.argv)
widget = ButtonColorWidget()
widget.show()
sys.exit(application.exec_()) 



Am Freitag, den 17.05.2019, 06:34 -0700 schrieb Luna Tuna:
> Thanks, I'll check it out. 
> 
> I just made a local function "connectButton" and that does the
> trick.  But I like the default lambda parameter for more conciseness.
> 
> On Fri, May 17, 2019 at 1:06 AM Florian Bruhin <me at the-compiler.org>
> wrote:
> > Hi,
> > 
> > 
> > 
> > another possibility is using functools.partial instead:
> > 
> > 
> > 
> >    
> > button.clicked.connect(functools.partial(self.show_color_dialog,
> > color))
> > 
> > 
> > 
> > IMHO, this is a nice explanation of the issue and possible
> > solutions:
> > 
> > 
https://docs.python-guide.org/writing/gotchas/#late-binding-closures
> > 
> > 
> > 
> > Florian
> > 
> > 
> > 
> > _______________________________________________PyQt mailing
> > list    PyQt at riverbankcomputing.com
> > https://www.riverbankcomputing.com/mailman/listinfo/pyqt
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://www.riverbankcomputing.com/pipermail/pyqt/attachments/20190519/9a291573/attachment.html>


More information about the PyQt mailing list