「Krita」と「Python」でUIパーツを使って「ドッキングパネル」を構築する

2025年4月11日(金)
大西 武 (オオニシ タケシ)
第15回の今回は「Krita」のメインUIの右側にあるエリアにドッキングするパネルにUIパーツを配置して構築する解説をします。

背景色を変更するドッキングパネル

赤緑青を表す3つのスライダーUIを配置して、それぞれの色を0~255以下までスライドさせてキャンバスの背景色を指定します。ここでは1番上のレイヤーを背景色で塗り潰しているだけですが、背景色のレイヤー名を指定してそのレイヤーを背景色で塗り潰すようにすれば良いでしょう。

赤青緑を表す3本のスライダーUI

なぜか今までの連載のようにドキュメントを作成してビューを追加できなかったので、ドッカーではアクティブなドキュメントを取得します。そのため、先に必ず「開始」→「新しい画像」を「作成」してドキュメントを新規作成しておく必要があります。

サンプルスクリプトの最後でKritaに「MyDockerBgColor」ドッカーを登録したら「__init__」メソッドでスライダーを3つ作成します。「canvasChanged」メソッドでキャンバスが変更されたときにドキュメントを取得します。スライダーを動かしたら「change_slider」メソッドを呼び出して「get_bgcolor」メソッドで背景色を設定し、「set_layer」メソッドでレイヤーを塗り潰します(図5)。

図5:ドッキングパネルで背景色を変更する

・サンプルスクリプト「krita」→「pykrita」→「docker_bgcolor」→「docker_bgcolor.py」
# モジュール
from PyQt5.QtWidgets import *
from krita import *
# ドッカークラス
class MyDockerBgColor(DockWidget):
  # 初期化メソッド
  def __init__(self):
    super().__init__()
    self.setWindowTitle("背景色ドッカー(「設定」→「ドッキングパネル」の一覧に表示される)")
    mainWidget = QWidget(self)
    self.setWidget(mainWidget)
    # レイアウト
    layout = QGridLayout()
    # スライダーUIを構築
    self.sliderR = QSlider(Qt.Horizontal)
    self.sliderR.setMaximum(255)
    layout.addWidget(self.sliderR)
    # スライダーが動いたら「change_slider」メソッドを呼び出す
    self.sliderR.valueChanged.connect(self.change_slider)
    # スライダーUIを構築
    self.sliderG = QSlider(Qt.Horizontal)
    self.sliderG.setMaximum(255)
    layout.addWidget(self.sliderG)
    # スライダーが動いたら「change_slider」メソッドを呼び出す
    self.sliderG.valueChanged.connect(self.change_slider)
    # スライダーUIを構築
    self.sliderB = QSlider(Qt.Horizontal)
    self.sliderB.setMaximum(255)
    layout.addWidget(self.sliderB)
    # スライダーが動いたら「change_slider」メソッドを呼び出す
    self.sliderB.valueChanged.connect(self.change_slider)
    # レイアウト
    mainWidget.setLayout(layout)
  # スライダーが動いたら呼ばれる
  def change_slider(self):
    red = self.sliderR.value()
    green = self.sliderG.value()
    blue = self.sliderB.value()
    bgcolor = self.get_bgcolor(red,green,blue)
    self.set_layer(bgcolor)
    self.doc.refreshProjection()
  # 背景色の取得
  def get_bgcolor(self,red,green,blue):
    color = QColor(red,green,blue)
    pixmap = QPixmap(self.doc.bounds().size())
    pixmap.fill(color)
    return pixmap.toImage()
  # レイヤーのセット
  def set_layer(self,img):
    root = self.doc.rootNode()
    layer = root.childNodes()[0]
    if img.sizeInBytes() == 4 * layer.channels()[0].channelSize() * self.doc.width() * self.doc.height():
      ptr = img.bits()
      ptr.setsize(img.byteCount())
      layer.setPixelData(QByteArray(ptr.asstring()), 0, 0, self.doc.width(), self.doc.height())
    else:
      print('Error')
  # キャンバスが変更されたら呼ばれる
  def canvasChanged(self, canvas):
    # ドキュメントの取得
    self.doc = Krita.instance().activeDocument()
# ドッカーを追加
Krita.instance().addDockWidgetFactory(DockWidgetFactory("MyDockerBgColor", DockWidgetFactoryBase.DockRight, MyDockerBgColor))

【サンプルスクリプトの解説】
モジュールを読み込みます。
DockWidgetを継承した「MyDockerBgColor」クラスを宣言します。
__init__メソッドでレイアウトに赤「sliderR」、緑「sliderG」、青「sliderB」のスライダーUI(QSlider)を作ってレイアウトに配置します。スライダーの最大値は255以下にセットします(setMaximum)。3つのいずれもスライダーの値が変化したら「change_slider」メソッドを呼び出します。
change_sliderメソッドで赤緑青のスライダーの値を取得して描画メソッドを呼び出します。
get_bgcolorメソッドで赤緑青をQColorのcolor変数に変換し、QPixmapをcolor変数で塗り潰します。
set_layerメソッドで現在のドキュメントの一番上のレイヤーを背景色で塗り潰します。
canvasChangedメソッドでキャンバスが変更されるたびにdocプロパティにアクティブなドキュメントを取得します。

初期化ファイル

特に何も実行していないのですが、初期化__init__.pyファイルも用意します。

・サンプルスクリプト「krita」→「pykrita」→「docker_bgcolor」→「__init__.py」
from .docker_bgcolor import MyDockerBgColor

【サンプルスクリプトの解説】
モジュールを読み込みます。

ドッカーをプラグインに設定する

ドッカープラグインを設定するには.desktopファイル(ここでは「docker_bgcolor.desktop」ファイル)に記述します。「X-KDE-Library」に「docker_bgcolor」プログラムを指定します。

・サンプルスクリプト「krita」→「pykrita」→「docker_bgcolor」→「docker_bgcolor.desktop」
[Desktop Entry]
Type=Service
ServiceTypes=Krita/PythonPlugin
X-KDE-Library=docker_bgcolor
X-Python-2-Compatible=false
Name=MyDockerBgColor
Comment=MyDockerBgColorドッキングパネル。

ドッカープラグインのインストール

docker_bgcolorドッカーのスクリプトを配置するのはdocker_messageboxプラグインの配置のときとほぼ同じです。1.か2.を操作すれば、図6のようにドッキングパネルメニューが選べます。

図6:「背景色ドッカー」メニュー

  1. 「C:/Users/ユーザー名/AppData/Roaming/krita/pykrita」フォルダに「docker_bgcolor/__init__.py」ファイル、「docker_bgcolor/docker_bgcolor.py」ファイル、「docker_bgcolor.desktop」ファイルを配置します。
  2. または、ドッカープラグインをzipファイルを使ってインストールするには「docker_bgcolor_plugin」フォルダに「docker_bgcolor/__init__.py」ファイル、「docker_bgcolor/docker_bgcolor.py」ファイル、「docker_bgcolor.desktop」ファイルを入れ、「docker_bgcolor_plugin」フォルダをzipファイルに圧縮します。Kritaの「ツール」→「スクリプト」→「Pythonプラグインをファイルからインポート」メニューを実行します。
    【コラム】ドッカーやプラグインを作る際に

    ドッカーやプラグインを作る際には、いきなり完成形を作ってしまうとデバッグがとても大変です。もちろんエラーの箇所を教えてくれますが、修正作業に手間がかかります。

    そこで、まず「スクリプター」で実行テストしてからにすると良いでしょう。そのためにはドッキングパネルへ配置する前に、QDialogクラスを使ったダイアログでベータ版を作って実行テストしてみましょう。

おわりに

今回はKritaのメインUIにドッキングパネルを取り付けて、そのドッキングパネルにUIパーツを配置する解説をしました。UIパーツは他にもたくさん存在するので、ぜひみなさん自身で色々と試してみてください。

本連載は今回で終了となりますが、また次回の新連載「WebGPUによる3Dアニメーション入門」でお会いしましょう!

著者
大西 武 (オオニシ タケシ)
1975年香川県生まれ。大阪大学経済学部経営学科中退。プログラミング入門書など30冊以上を商業出版する作家。Microsoftで大賞やNTTドコモでグランプリなど20回以上全国区のコンテストに入賞するアーティスト。オリジナルの間違い探し「3Dクイズ」が全国放送のTVで約10回出題。
https://profile.vixar.jp

連載バックナンバー

開発言語技術解説
第15回

「Krita」と「Python」でUIパーツを使って「ドッキングパネル」を構築する

2025/4/11
第15回の今回は「Krita」のメインUIの右側にあるエリアにドッキングするパネルにUIパーツを配置して構築する解説をします。
開発言語技術解説
第14回

「Krita」と「Python」でプラグインを作ろう

2025/3/21
第14回の今回は「Krita」で「Python」スクリプトを「プラグイン」にしたり、「ショートカットキー」をセットする解説をします。
開発言語技術解説
第13回

「Krita」と「Python」でオリジナルの幾何学模様を作ろう

2025/2/27
第13回の今回は「Krita」の「Python」でダイアログUIにUIパーツを貼り付けて操作できるようにして、オリジナルの幾何学模様を作成できるプログラムを解説します。さらにアニメーションも作ります。

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています