Créer une barre de couleurs avec Python + Qt (PySide)

Le QColorDialog de PySide semble normal, j'ai donc créé mon propre widget de sélection de couleurs. Ici, nous allons introduire la barre de couleur. La bonne chose à propos de Python & Qt est que même moi, qui suis en Python depuis 3 mois, je peux faire quelque chose comme ça.

J'ai enregistré la source sur GitHub. https://github.com/tokyo-noctambulist/colorpicker.git

(Mis à jour le 07/03/2017) Modification de la valeur transmise par référence lors de la spécification de la couleur à copier

échantillon

image

Dans sample.py, les barres de couleur des deux teintes sont liées et la barre de couleur de transparence est affichée séparément.


Type de barre de couleur

Vous pouvez sélectionner le type de barre de couleur parmi la teinte, la saturation, la luminosité et la transparence. Je me suis inscrit auprès de PyPI. Vous pouvez l'installer avec pip etc.

type valeur
Teinte BAR_TYPE_HUE = 0
saturation BAR_TYPE_SATURATION = 1
luminosité BAR_TYPE_VALUE = 2
Transparence BAR_TYPE_ALPHA = 3

function


pip install colorpicker #install

from colorpicker import *

QColorBarWidget(parent,Type de BAR(=Teinte lorsque non spécifié))

widget = QColorBarWidget(self, BAR_TYPE_VALUE)
widget.setColor(QColor(0,0,0,0)) #Définir la couleur
color = widget.getColor() #Obtenez de la couleur
colorBar.colorChanged.connect(onUpdateColor) # signal-slot

Si vous souhaitez afficher plusieurs sélecteurs de couleurs comme Photoshop ou Painter et lier les couleurs, recevez le changement de couleur avec le signal () de colorChanged et liez-le à d'autres widgets.


QColorBarWidget.py


from __future__ import division, print_function, unicode_literals, absolute_import

from PySide.QtGui import *
from PySide.QtCore import *

# TYPE
BAR_TYPE_HUE = 0
BAR_TYPE_SATURATION = 1
BAR_TYPE_VALUE = 2
BAR_TYPE_ALPHA = 3
BAR_TYPE_MAX = 4

Lupe_Color = [
    QColor(0, 0, 0, 255),
    QColor(0, 0, 0, 255),
    QColor(255, 255, 255, 255),
    QColor(255, 0, 0, 255)
]


class QColorBarWidget(QGraphicsView):
    colorChanged = Signal(str)

    def __init__(self, parent, type=BAR_TYPE_HUE):
        super(QColorBarWidget, self).__init__(parent)
        self.scene = QGraphicsScene(self)
        self.setScene(self.scene)
        self.width = 0

        self.type = type if type < BAR_TYPE_MAX else BAR_TYPE_HUE
        self.lupe_color = Lupe_Color[type]

        self.color = QColor()
        self.color.setHsv(0, 255, 255, 255)
        self.setColor(self.color)

        # BG
        pixmap = QPixmap(QSize(16, 16))
        tile = QPainter(pixmap)
        tile.save()
        brush1 = QBrush(QColor(128, 128, 128))
        brush2 = QBrush(QColor(168, 168, 168))
        tile.fillRect(0, 0, 8, 8, brush1)
        tile.fillRect(8, 8, 8, 8, brush1)
        tile.fillRect(8, 0, 8, 8, brush2)
        tile.fillRect(0, 8, 8, 8, brush2)
        tile.restore()
        tile.end()
        self.bg_brush = QBrush(pixmap)

    def drawBackground(self, painter, rect):
        """
        :type rect: QRectF
        :type painter: QPainter
        """
        painter.save()
        painter.fillRect(rect, self.bg_brush)
        painter.restore()

    def drawForeground(self, painter, rect):
        """
        :type rect: QRectF
        :type painter: QPainter
        """
        painter.save()
        painter.translate(rect.center())
        painter.setRenderHint(QPainter.Antialiasing, True)
        self.width = rect.toRect().width()
        half_width = self.width / 2
        height = rect.toRect().height()
        half_height = height / 2
        # bar
        gradient = QLinearGradient(-half_width, 0, half_width, 0)
        self.makeGradient(gradient)
        painter.setBrush(gradient)
        painter.drawRect(-half_width, -half_height, self.width, height)
        # lupe
        painter.setPen(QPen(self.lupe_color, 1))
        painter.setBrush(QColor(0, 0, 0, 0))
        half_width = self.px - half_width
        painter.drawEllipse(half_width - 2, 2 - half_height, 5, 5)
        painter.fillRect(half_width, 6 - half_height, 1, height, QBrush(self.lupe_color))

        painter.restore()

    def mouseMoveEvent(self, event):
        self.clickToColor(event)

    def mousePressEvent(self, event):
        if event.button() == Qt.LeftButton:
            self.clickToColor(event)

    def clickToColor(self, event):
        self.px = event.pos().x()
        param = self.px / self.width
        param = 0 if param < 0 else param
        if self.type == BAR_TYPE_HUE:
            self.color.setHsv(360 * param, self.color.saturation(), self.color.value(), self.color.alpha())
        elif self.type == BAR_TYPE_SATURATION:
            self.color.setHsv(self.color.hue(), 255 * param, self.color.value(), self.color.alpha())
        elif self.type == BAR_TYPE_VALUE:
            self.color.setHsv(self.color.hue(), self.color.saturation(), 255 * param, self.color.alpha())
        else:  # alpha
            self.color.setAlphaF(param)

        self.colorChanged.emit('colorChanged')
        self.scene.update()

    def getColor(self):
        return (self.color)

    def setColor(self, color):
        self.color = QColor(color)
        if self.type == BAR_TYPE_HUE:
            self.px = color.hue() * self.width / 360
        elif self.type == BAR_TYPE_SATURATION:
            self.px = color.saturation() * self.width / 255
        elif self.type == BAR_TYPE_VALUE:
            self.px = color.value() * self.width / 255
        else:  # alpha
            self.px = color.alpha() * self.width / 255
        self.scene.update()

    def makeGradient(self, gradient):
        color = QColor()
        if self.type == BAR_TYPE_HUE:
            for _ in range(11):
                color.setHsv(_ * 36, 255, 255, 255)
                gradient.setColorAt(0.1 * _, color)
        elif self.type == BAR_TYPE_SATURATION:
            color.setHsv(360, 0, 255, 255)
            gradient.setColorAt(0.0, color)
            color.setHsv(360, 255, 255, 255)
            gradient.setColorAt(1.0, color)
        elif self.type == BAR_TYPE_VALUE:
            color.setHsv(360, 255, 0, 255)
            gradient.setColorAt(0.0, color)
            color.setHsv(360, 255, 255, 255)
            gradient.setColorAt(1.0, color)
        else:  # alpha
            color.setRgb(255, 255, 255, 0)
            gradient.setColorAt(0.0, color)
            color.setRgb(255, 255, 255, 255)
            gradient.setColorAt(1.0, color)
        return

sample.py


from __future__ import division, print_function, unicode_literals, absolute_import

from PySide.QtGui import *
from PySide.QtCore import *
import sys

class MainWindow(QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.resize(300, 100)

        self.colorBar1 = QColorBarWidget(self)
        self.colorBar1.resize(150, 20)

        self.colorBar2 = QColorBarWidget(self, BAR_TYPE_HUE)
        self.colorBar2.resize(250, 30)
        self.colorBar2.move(0, 30)

        self.colorBar3 = QColorBarWidget(self, BAR_TYPE_ALPHA)
        self.colorBar3.resize(200, 20)
        self.colorBar3.move(50, 70)

        self.colorBar1.colorChanged.connect(self.onUpdateColor1)
        self.colorBar2.colorChanged.connect(self.onUpdateColor2)

    @Slot()
    def onUpdateColor1(self):
        color = self.colorBar1.getColor()
        self.colorBar2.setColor(color)

    @Slot()
    def onUpdateColor2(self):
        color = self.colorBar2.getColor()
        self.colorBar1.setColor(color)

def main():
    app = QApplication(sys.argv)
    main_window = MainWindow()
    main_window.show()
    sys.exit(app.exec_())

if __name__ == "__main__":
    main()

Recommended Posts

Créer une barre de couleurs avec Python + Qt (PySide)
Créer un widget avec une couleur spécifiée avec Python + Qt (PySide)
Créez un sélecteur de couleurs pour la roue chromatique avec Python + Qt (PySide)
Créer un répertoire avec python
Créez un environnement virtuel avec Python!
Créer un décorateur de fonction Python avec Class
Créez une image factice avec Python + PIL.
[Python] Créez un environnement virtuel avec Anaconda
Créons un groupe gratuit avec Python
Créer un compteur de fréquence de mots avec Python 3.4
Créer un cadre avec un arrière-plan transparent avec tkinter [Python]
Créer un module Python
Créer un LINE BOT avec Minette pour Python
Créer un environnement virtuel avec conda avec Python
Créer une page qui se charge indéfiniment avec python
[Note] Créez une classe de fuseau horaire sur une ligne avec python
Vous pouvez facilement créer une interface graphique même avec Python
Créer un environnement de construction python3 avec Sublime Text3
Étapes pour créer un bot Twitter avec Python
Créer un arbre de décision à partir de 0 avec Python (1. Présentation)
Créer une nouvelle page en confluence avec Python
Créer un fichier au format Photoshop (.psd) avec python
Créer un environnement Python
Facile à créer une application console Python avec Click
Pourquoi ne pas créer facilement une table élégante avec Python?
Créez un environnement de développement python avec vagrant + ansible + fabric
Remplissez l'arrière-plan d'une seule couleur avec OpenCV2 + Python
Créer une couche pour AWS Lambda Python dans Docker
[python] Créez un tableau de dates avec des incréments arbitraires avec np.arange
[Python] Comment créer un histogramme bidimensionnel avec Matplotlib
[Python] Créez un fichier de distribution pour le programme Tkinter avec cx_Freeze
Créez un faux serveur Minecraft en Python avec Quarry
Créer un fichier CAO 2D ".dxf" avec python [ezdxf]
Créer un plugin Wox (Python)
Créer une fonction en Python
Créer un dictionnaire en Python
Créer un gif 3D avec python3
Créer une page d'accueil avec django
[Python] Ajustement de la barre de couleurs
Créer un tableau numpy python
Faites une loterie avec Python
[Python] Créez un écran de spécification de chemin de fichier et de dossier avec tkinter
Créer un compte enfant de connect with Stripe en Python
Créons un script qui s'enregistre avec Ideone.com en Python.
Probablement le moyen le plus simple de créer un pdf avec Python 3
Créons un diagramme PRML avec Python, Numpy et matplotlib.
Détecter les objets d'une couleur et d'une taille spécifiques avec Python
Créez un Twitter BOT avec le SDK GoogleAppEngine pour Python
Créez un outil d'analyse vidéo simple avec python wxpython + openCV
Créez un environnement de développement Python simple avec VSCode et Docker Desktop
Créer un message correspondant à la localisation avec la chaîne de traduction python
[Python] Créer un écran pour le code d'état HTTP 403/404/500 avec Django
[Python] Qu'est-ce qu'une instruction with?
Résoudre ABC163 A ~ C avec Python
Créer une animation de tracé avec Python + Matplotlib