View  Edit  Attributes  History  Attach  Print  Search

PYQTLAB

PyQt Lab' : Créer une image de couleur unie simple et régler la couleur avec des sliders

Par X. HINAULT - Juin 2013

Ce que l'on va faire ici

  • Affichage d'un QPixmap vide dans un QLabel et modification de la couleur par 3 sliders RGB

Pré-requis

  • python 2.7
  • pyqt4.x

Le fichier d'interface *.py

  • Fichier obtenu automatiquement avec l'utilitaire pyuic4 à partir du fichier *.ui créé avec QtDesigner :
# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file
#
# Created: Mon Jun 10 15:47:25 2013
#      by: PyQt4 UI code generator 4.9.1
#
# WARNING! All changes made in this file will be lost!

from PyQt4 import QtCore, QtGui

try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    _fromUtf8 = lambda s: s

class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName(_fromUtf8("Form"))
        Form.resize(333, 319)
        self.labelRouge = QtGui.QLabel(Form)
        self.labelRouge.setGeometry(QtCore.QRect(5, 260, 51, 13))
        self.labelRouge.setObjectName(_fromUtf8("labelRouge"))
        self.labelBleu = QtGui.QLabel(Form)
        self.labelBleu.setGeometry(QtCore.QRect(5, 300, 51, 13))
        self.labelBleu.setObjectName(_fromUtf8("labelBleu"))
        self.labelImage = QtGui.QLabel(Form)
        self.labelImage.setGeometry(QtCore.QRect(5, 15, 320, 240))
        self.labelImage.setStyleSheet(_fromUtf8("background-color: rgb(180, 180, 180);"))
        self.labelImage.setText(_fromUtf8(""))
        self.labelImage.setObjectName(_fromUtf8("labelImage"))
        self.horizontalSliderBleu = QtGui.QSlider(Form)
        self.horizontalSliderBleu.setGeometry(QtCore.QRect(45, 295, 201, 20))
        self.horizontalSliderBleu.setMaximum(255)
        self.horizontalSliderBleu.setOrientation(QtCore.Qt.Horizontal)
        self.horizontalSliderBleu.setObjectName(_fromUtf8("horizontalSliderBleu"))
        self.lcdNumberBleu = QtGui.QLCDNumber(Form)
        self.lcdNumberBleu.setGeometry(QtCore.QRect(255, 300, 64, 15))
        self.lcdNumberBleu.setStyleSheet(_fromUtf8("background-color: rgb(170, 255, 255);\n"
"color: rgb(0, 0, 255);"))
        self.lcdNumberBleu.setFrameShape(QtGui.QFrame.NoFrame)
        self.lcdNumberBleu.setFrameShadow(QtGui.QFrame.Raised)
        self.lcdNumberBleu.setSegmentStyle(QtGui.QLCDNumber.Flat)
        self.lcdNumberBleu.setObjectName(_fromUtf8("lcdNumberBleu"))
        self.horizontalSliderVert = QtGui.QSlider(Form)
        self.horizontalSliderVert.setGeometry(QtCore.QRect(45, 275, 201, 20))
        self.horizontalSliderVert.setMaximum(255)
        self.horizontalSliderVert.setOrientation(QtCore.Qt.Horizontal)
        self.horizontalSliderVert.setObjectName(_fromUtf8("horizontalSliderVert"))
        self.horizontalSliderRouge = QtGui.QSlider(Form)
        self.horizontalSliderRouge.setGeometry(QtCore.QRect(45, 255, 201, 20))
        self.horizontalSliderRouge.setMaximum(255)
        self.horizontalSliderRouge.setOrientation(QtCore.Qt.Horizontal)
        self.horizontalSliderRouge.setObjectName(_fromUtf8("horizontalSliderRouge"))
        self.labelVert = QtGui.QLabel(Form)
        self.labelVert.setGeometry(QtCore.QRect(5, 280, 51, 13))
        self.labelVert.setObjectName(_fromUtf8("labelVert"))
        self.lcdNumberRouge = QtGui.QLCDNumber(Form)
        self.lcdNumberRouge.setGeometry(QtCore.QRect(255, 260, 64, 15))
        self.lcdNumberRouge.setStyleSheet(_fromUtf8("background-color: rgb(255, 170, 255);\n"
"color: rgb(255, 0, 0);"))
        self.lcdNumberRouge.setFrameShape(QtGui.QFrame.NoFrame)
        self.lcdNumberRouge.setSegmentStyle(QtGui.QLCDNumber.Flat)
        self.lcdNumberRouge.setObjectName(_fromUtf8("lcdNumberRouge"))
        self.lcdNumberVert = QtGui.QLCDNumber(Form)
        self.lcdNumberVert.setGeometry(QtCore.QRect(255, 280, 64, 15))
        self.lcdNumberVert.setStyleSheet(_fromUtf8("background-color: rgb(170, 255, 127);\n"
"color: rgb(0, 170, 0);"))
        self.lcdNumberVert.setFrameShape(QtGui.QFrame.NoFrame)
        self.lcdNumberVert.setSegmentStyle(QtGui.QLCDNumber.Flat)
        self.lcdNumberVert.setObjectName(_fromUtf8("lcdNumberVert"))

        self.retranslateUi(Form)
        QtCore.QObject.connect(self.horizontalSliderRouge, QtCore.SIGNAL(_fromUtf8("valueChanged(int)")), self.lcdNumberRouge.display)
        QtCore.QObject.connect(self.horizontalSliderVert, QtCore.SIGNAL(_fromUtf8("valueChanged(int)")), self.lcdNumberVert.display)
        QtCore.QObject.connect(self.horizontalSliderBleu, QtCore.SIGNAL(_fromUtf8("valueChanged(int)")), self.lcdNumberBleu.display)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        Form.setWindowTitle(QtGui.QApplication.translate("Form", "PyQt : dessin : qpixmap vide et sliders", None, QtGui.QApplication.UnicodeUTF8))
        self.labelRouge.setText(QtGui.QApplication.translate("Form", "Rouge", None, QtGui.QApplication.UnicodeUTF8))
        self.labelBleu.setText(QtGui.QApplication.translate("Form", "Bleu", None, QtGui.QApplication.UnicodeUTF8))
        self.labelVert.setText(QtGui.QApplication.translate("Form", "Vert", None, QtGui.QApplication.UnicodeUTF8))


if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    Form = QtGui.QWidget()
    ui = Ui_Form()
    ui.setupUi(Form)
    Form.show()
    sys.exit(app.exec_())
 

Le fichier d'application *Main.py

#!/usr/bin/python
# -*- coding: utf-8 -*-

# par X. HINAULT - Mai 2013 - Tous droits réservés
# GPLv3 - www.mon-club-elec.fr

# modules a importer
from PyQt4.QtGui import *
from PyQt4.QtCore import *  # inclut QTimer..
import os,sys

from tuto_pyqt_dessin_qpixmap_vide_sliders import * # fichier obtenu à partir QtDesigner et pyuic4

# +/- variables et objets globaux

class myApp(QWidget, Ui_Form): # la classe reçoit le Qwidget principal ET la classe définie dans test.py obtenu avec pyuic4
        def __init__(self, parent=None):
                QWidget.__init__(self) # initialise le Qwidget principal
                self.setupUi(parent) # Obligatoire

                # --- Variables de classe

                # --- Paramétrage des widgets de l'interface GUI si nécessaire ---

                # --- Connexions entre signaux des widgets et fonctions
                # connecte chaque signal utilisé des objets à l'appel de la fonction voulue

                self.connect(self.horizontalSliderRouge, SIGNAL("valueChanged(int)"), self.horizontalSliderRougeValueChanged)
                self.connect(self.horizontalSliderVert, SIGNAL("valueChanged(int)"), self.horizontalSliderVertValueChanged)
                self.connect(self.horizontalSliderBleu, SIGNAL("valueChanged(int)"), self.horizontalSliderBleuValueChanged)

                # --- Code actif initial  ---

                # dessin
                self.pixmap=QPixmap(self.labelImage.size()) # crée un qpixmap de la taille du label d'affichage
                self.pixmap.fill(QColor(0,0,0)) # remplit le pixmap en noir

                self.labelImage.setPixmap(self.pixmap) # met à jour le qpixmap affiché dans le qlabel

        # --- les fonctions appelées, utilisées par les signaux des widgets ---

        def horizontalSliderRougeValueChanged(self, valeur): # fonction appelée si changement valeur slider - reçoit la valeur courante
                print("Slider horizontal Rouge modifié : valeur = " + str(valeur))
                self.reDraw()

        def horizontalSliderVertValueChanged(self, valeur): # fonction appelée si changement valeur slider - reçoit la valeur courante
                print("Slider horizontal Vert modifié : valeur = " + str(valeur))
                self.reDraw()

        def horizontalSliderBleuValueChanged(self, valeur): # fonction appelée si changement valeur slider - reçoit la valeur courante
                print("Slider horizontal Bleu modifié : valeur = " + str(valeur))
                self.reDraw()

        # --- les fonctions appelées, utilisées par les signaux hors widgets ---
        def reDraw(self): # MAJ le QLabel en fonction valeur pixmap
                #print ("reDraw()")

                #-- récupère les valeurs courants des sliders
                r=self.horizontalSliderRouge.value()
                v=self.horizontalSliderVert.value()
                b=self.horizontalSliderBleu.value()

                #-- MAJ le qpixmap et qlabel --
                self.pixmap.fill(QColor(r,v,b)) # remplit le pixmap avec la couleur
                self.labelImage.setPixmap(self.pixmap) # met à jour le qpixmap affiché dans le qlabel

        # --- fonctions de classes autres---    

# -- Autres Classes utiles --

# -- Classe principale (lancement)  --
def main(args):
        a=QApplication(args) # crée l'objet application
        f=QWidget() # crée le QWidget racine
        c=myApp(f) # appelle la classe contenant le code de l'application
        f.show() # affiche la fenêtre QWidget
        r=a.exec_() # lance l'exécution de l'application
        return r

if __name__=="__main__": # pour rendre le code exécutable
        main(sys.argv) # appelle la fonction main
 

Utilisation

  • Les 2 fichiers suivants sont à enregistrer dans un même répertoire, l'un en nom.py et l'autre en nomMain.py.
  • Puis lancer l'application depuis Geany ou équivalent, en exécutant le fichier nomMain.py
  • Régler les sliders pour modifier la couleur du fond de l'image.