Erstellen Sie eine Farbleiste mit Python + Qt (PySide)

Der QColorDialog von PySide sieht normal aus, daher habe ich mein eigenes Farbauswahl-Widget erstellt. Hier stellen wir die Farbleiste vor. Das Gute an Python & Qt ist, dass selbst ich, der seit 3 Monaten in Python ist, so etwas machen kann.

Ich habe die Quelle auf GitHub registriert. https://github.com/tokyo-noctambulist/colorpicker.git

(Aktualisiert am 07.03.2017) Der als Referenz übergebene Wert wurde geändert, wenn die zu kopierende Farbe angegeben wurde

Stichprobe

image

In sample.py werden die Farbbalken der beiden Farbtöne verknüpft und der Transparenzfarbbalken wird separat angezeigt.


Farbbalkentyp

Sie können den Typ des Farbbalkens aus Farbton, Sättigung, Helligkeit und Transparenz auswählen. Ich habe mich bei PyPI registriert. Sie können es mit Pip usw. installieren.

Art Wert
Farbton BAR_TYPE_HUE = 0
Sättigung BAR_TYPE_SATURATION = 1
Helligkeit BAR_TYPE_VALUE = 2
Transparenz BAR_TYPE_ALPHA = 3

function


pip install colorpicker #install

from colorpicker import *

QColorBarWidget(Elternteil,Art der Leiste(=Farbton, wenn nicht angegeben))

widget = QColorBarWidget(self, BAR_TYPE_VALUE)
widget.setColor(QColor(0,0,0,0)) #Stellen Sie die Farbe ein
color = widget.getColor() #Holen Sie sich Farbe
colorBar.colorChanged.connect(onUpdateColor) # signal-slot

Wenn Sie mehrere Farbwähler wie Photoshop oder Painter anzeigen und die Farben verknüpfen möchten, empfangen Sie die Farbänderung mit dem Signal () von colorChanged und verknüpfen Sie sie mit anderen 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

Erstellen Sie eine Farbleiste mit Python + Qt (PySide)
Erstellen Sie mit Python + Qt (PySide) ein farbspezifisches Widget.
Erstellen Sie mit Python + Qt (PySide) einen Farbwähler für das Farbrad.
Erstellen Sie ein Verzeichnis mit Python
Erstellen Sie eine virtuelle Umgebung mit Python!
Erstellen Sie mit Class einen Python-Funktionsdekorator
Erstellen Sie mit Python + PIL ein Dummy-Image.
[Python] Erstellen Sie mit Anaconda eine virtuelle Umgebung
Erstellen wir mit Python eine kostenlose Gruppe
Erstellen Sie mit Python 3.4 einen Worthäufigkeitszähler
Erstellen Sie mit tkinter [Python] einen Rahmen mit transparentem Hintergrund.
Erstellen Sie ein Python-Modul
Erstellen Sie mit Minette für Python einen LINE BOT
Erstellen Sie eine virtuelle Umgebung mit conda in Python
Erstellen Sie eine Seite, die unbegrenzt mit Python geladen wird
[Hinweis] Erstellen Sie mit Python eine einzeilige Zeitzonenklasse
Sie können auch mit Python problemlos eine GUI erstellen
Erstellen Sie mit Sublime Text3 eine Python3-Build-Umgebung
Schritte zum Erstellen eines Twitter-Bots mit Python
Erstellen Sie mit Python einen Entscheidungsbaum von 0 (1. Übersicht)
Erstellen Sie eine neue Seite im Zusammenfluss mit Python
Erstellen Sie mit Python eine Datei im Photoshop-Format (.psd)
Erstellen Sie eine Python-Umgebung
Erstellen Sie einfach eine Python-Konsolenanwendung mit Click
Warum nicht einfach mit Python eine stilvolle Tabelle erstellen?
Erstellen Sie eine Python-Entwicklungsumgebung mit Vagrant + Ansible + Fabric
Füllen Sie den Hintergrund mit einer einzigen Farbe mit OpenCV2 + Python
Erstellen Sie in Docker eine Ebene für AWS Lambda Python
[Python] Erstellen Sie mit np.arange ein Datumsarray mit beliebigen Inkrementen
[Python] So erstellen Sie mit Matplotlib ein zweidimensionales Histogramm
[Python] Erstellen Sie mit cx_Freeze eine Verteilungsdatei für das Tkinter-Programm
Erstellen Sie mit Quarry einen gefälschten Minecraft-Server in Python
Erstellen Sie eine 2D-CAD-Datei ".dxf" mit Python [ezdxf]
Erstellen Sie ein Wox-Plugin (Python)
Erstellen Sie eine Funktion in Python
Erstellen Sie ein Wörterbuch in Python
Erstellen Sie ein 3D-GIF mit Python3
Erstellen Sie eine Homepage mit Django
[Python] Anpassen der Farbleiste
Erstellen Sie ein Python-Numpy-Array
Machen Sie eine Lotterie mit Python
[Python] Erstellen Sie mit tkinter einen Bildschirm zur Datei- und Ordnerpfadspezifikation
Erstellen Sie ein untergeordnetes Konto für die Verbindung mit Stripe in Python
Erstellen wir ein Skript, das sich bei Ideone.com in Python registriert.
Wahrscheinlich der einfachste Weg, um mit Python 3 ein PDF zu erstellen
Lassen Sie uns ein PRML-Diagramm mit Python, Numpy und matplotlib erstellen.
Erkennen Sie mit Python Objekte einer bestimmten Farbe und Größe
Erstellen Sie einen Twitter-BOT mit dem GoogleAppEngine SDK für Python
Erstellen Sie mit python wxpython + openCV ein einfaches Videoanalysetool
Erstellen Sie mit VSCode & Docker Desktop eine einfache Python-Entwicklungsumgebung
Erstellen Sie eine Nachricht, die der Lokalisierung entspricht, mit einer Python-Übersetzungszeichenfolge
[Python] Erstellen Sie mit Django einen Bildschirm für den HTTP-Statuscode 403/404/500
[Python] Was ist eine with-Anweisung?
Löse ABC163 A ~ C mit Python
Erstellen Sie eine Plotanimation mit Python + Matplotlib