Código de fuente de un selector de color para PyQt 4. PyQt 5 presenta incompatibilidad con versiones anteriores, por lo tanto no es soportado. El código corre en Python 2 y 3, en todas las plataformas soportadas por la librería. Permite especificar un color a través de sus valores RGB (rojo, verde, azul) utilizando el control QSlider. Además, el mismo puede indicarse a través de las cajas de texto en sus dos representaciones: RGB, propiamente dicho, y hexadecimal (o HTML).
Nótese que este código no tiene relación alguna con la clase QColorDialog, que provee el convencional selector de color.
Fuente
Puedes descargar el código de fuente desde este enlace (requiere Python 2.7 ó 3.x y PyQt 4) o verlo a continuación.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# colorchooser.py
#
# Copyright 2014 Recursos Python - www.recursospython.com
#
from PyQt4.QtCore import QRect
from PyQt4.QtGui import (QApplication, QGroupBox, QMainWindow, QLabel,
QLineEdit, QWidget, QSlider)
class Window(QMainWindow):
def __init__(self):
QMainWindow.__init__(self)
# Título y tamaño de la ventana.
self.setWindowTitle("Selector de color")
self.resize(320, 220)
# Group box.
self.color_group_box = QGroupBox(self)
self.color_group_box.setGeometry(QRect(10, 20, 300, 170))
self.color_group_box.setTitle("Color")
# Deslizadores.
# Rojo.
self.color_red_slider = QSlider(1, self.color_group_box)
self.color_red_slider.setGeometry(QRect(10, 20, 200, 20))
# Verde.
self.color_green_slider = QSlider(1, self.color_group_box)
self.color_green_slider.setGeometry(QRect(10, 50, 200, 20))
# Azul.
self.color_blue_slider = QSlider(1, self.color_group_box)
self.color_blue_slider.setGeometry(QRect(10, 80, 200, 20))
for slider in (self.color_red_slider, self.color_green_slider,
self.color_blue_slider):
# Establecer valor mínimo y máximo (0 - 255).
slider.setMinimum(0)
slider.setMaximum(255)
# Conectar la señal que indica si cambia el valor.
slider.valueChanged.connect(self.slider_value_changed)
# Widget en donde se visualizará el color.
self.color_widget = QWidget(self.color_group_box)
self.color_widget.setGeometry(QRect(220, 25, 70, 70))
self.rgb_label = QLabel(self.color_group_box)
self.rgb_label.setGeometry(QRect(10, 110, 25, 30))
self.rgb_label.setText("RGB: ")
# Caja de texto para el color en formato RGB.
self.rgb_edit = QLineEdit(self.color_group_box)
self.rgb_edit.setGeometry(QRect(53, 115, 80, 20))
self.rgb_edit.textEdited.connect(self.rgb_edit_changed)
self.html_label = QLabel(self.color_group_box)
self.html_label.setGeometry(QRect(10, 140, 40, 30))
self.html_label.setText("HTML: #")
# Caja de texto para el color en formato HTML (o hexadecimal).
self.html_edit = QLineEdit(self.color_group_box)
self.html_edit.setGeometry(QRect(53, 143, 80, 20))
self.html_edit.textEdited.connect(self.html_edit_changed)
# Evitar que se mueva el foco mientras escribe el usuario.
self.set_next_rgb_value = True
self.set_next_html_value = True
# Establecer el valor inicial (negro).
self.slider_value_changed(0)
def rgb_to_hex(self, rgb):
"""
Convertir un color RGB a hexadecimal.
"""
return "%02x%02x%02x" % rgb
def hex_to_rgb(self, color):
"""
Convertir un color hexadecimal a RGB.
"""
return tuple(int(color[i:i + 2], 16) for i in range(0, 6, 2))
def update_sliders(self, rgb):
"""
Actualizar los deslizadores.
"""
self.color_red_slider.setValue(rgb[0])
self.color_green_slider.setValue(rgb[1])
self.color_blue_slider.setValue(rgb[2])
def rgb_edit_changed(self, rgb):
"""
Actualizar los deslizadores cuando el usuario
modifique manualmente la caja de texto RGB.
"""
try:
rgb = tuple(int(i) for i in rgb.split(","))
except ValueError:
pass
else:
self.set_next_rgb_value = False
self.update_sliders(rgb)
def html_edit_changed(self, color):
"""
Actualizar los deslizadores cuando el usuario
modifique manualmente la caja de texto hexadecimal.
"""
self.set_next_html_value = False
if len(color) == 6:
try:
rgb = self.hex_to_rgb(str(color))
except ValueError:
pass
else:
self.update_sliders(rgb)
def slider_value_changed(self, value):
"""
Actualizar CSS (hoja de estilo) en el widget
que visualiza el color.
"""
# Nuevo valor.
new_rgb_value = (
self.color_red_slider.value(),
self.color_green_slider.value(),
self.color_blue_slider.value()
)
# Actualizar CSS.
self.color_widget.setStyleSheet(
"border: 1px solid black;"
"background-color: rgb(%d, %d, %d)" %
(
self.color_red_slider.value(),
self.color_green_slider.value(),
self.color_blue_slider.value()
)
)
# Insertar nuevos textos.
# Remover "(" y ")".
if self.set_next_rgb_value:
self.rgb_edit.setText(str(new_rgb_value)[1:-1])
else:
self.set_next_rgb_value = True
# Convertir a hexadecimal.
if self.set_next_html_value:
self.html_edit.setText(self.rgb_to_hex(new_rgb_value))
else:
self.set_next_html_value = True
if __name__ == "__main__":
app = QApplication([])
window = Window()
window.show()
app.exec_()
Curso online 👨💻
¡Ya lanzamos el curso oficial de Recursos Python en Udemy!
Un curso moderno para aprender Python desde cero con programación orientada a objetos, SQL y tkinter en 2024.
Consultoría 💡
Ofrecemos servicios profesionales de desarrollo y capacitación en Python a personas y empresas. Consultanos por tu proyecto.
