2022-06-14

【備忘録】指定した色で画像を塗りつぶす 〜 PySide6 〜

PySide (Qt for Python) は、Qt(キュート)の Python バインディングで、GUI などを構築するためのクロスプラットフォームなライブラリです。Linux/X11, macOS および Microsoft Windows をサポートしています。配布ライセンスは LGPL で公開されています。

下記の OS 環境で動作確認をしています。

Fedora Linux 36 x86_64
Python 3.10.4
PySide6 6.3.0

左の画像 circle.png を、指定した色で乗りつぶしてアイコンとして利用するサンプルを備忘録としてまとめました。

下記サンプル qt_pushbutton_image.py の get_colored_icon 関数では、画像の透明レイヤーをマスクにして、指定した色で単純に塗りつぶしています。何に使いたかったかと言うと、Matplotlib で作成した Scatter プロットの凡例をボタンで表示して、これでインタラクティブな操作をしたかったのです。

 

qt_pushbutton_image.py
#!/usr/bin/env python
# coding: utf-8
import sys
from PySide6.QtCore import Qt
from PySide6.QtGui import (
QColor,
QIcon,
QPixmap,
)
from PySide6.QtWidgets import (
QApplication,
QPushButton,
QSizePolicy,
QVBoxLayout,
QWidget,
)
def get_colored_icon(file_image: str, name_color: str) -> QIcon:
"""
get_colored_icon
:param file_image: file name of image
:param name_color: color code
:return: QIcon filled with specified color
"""
pixmap = QPixmap(file_image)
mask = pixmap.createMaskFromColor(QColor('transparent'), Qt.MaskInColor)
pixmap.fill(QColor(name_color))
pixmap.setMask(mask)
return QIcon(pixmap)
class Example(QWidget):
def __init__(self):
super().__init__()
self.init_ui()
self.setWindowTitle('PushButton')
def init_ui(self):
layout = QVBoxLayout()
self.setLayout(layout)
image = 'circle.png'
for color in ['red', 'green', 'blue']:
icon = get_colored_icon(image, color)
btn = QPushButton(icon, color)
btn.setStyleSheet('text-align:left; font-size:18pt;')
btn.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
btn.clicked.connect(self.button_clicked)
layout.addWidget(btn)
def button_clicked(self):
obj = self.sender()
print('\'%s\' button is clicked.' % obj.text())
def main():
app = QApplication(sys.argv)
ex = Example()
ex.show()
sys.exit(app.exec())
if __name__ == '__main__':
main()
qt_pushbutton_image.py の実行例

 

参考サイト

  1. QPixmap - Qt for Python

 

ブログランキング・にほんブログ村へ bitWalk's - にほんブログ村 にほんブログ村 IT技術ブログ Linuxへ
にほんブログ村

0 件のコメント: