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

2025年3月21日(金)
大西 武 (オオニシ タケシ)
第14回の今回は「Krita」で「Python」スクリプトを「プラグイン」にしたり、「ショートカットキー」をセットする解説をします。

UIを使ったプラグインを作る

第12回のサンプル「dlg_rect_class.py」をプラグインにします。これまでと同様に、Extensionクラスを継承したプラグインクラスから正方形を描画するPythonスクリプトを呼び出すだけです。完成するとスライダーUIと正方形がランダムに表示されます(図5)。

図5:スライダーをドラッグすると正方形がランダムに描画される

メインのUIを使ったプラグイン

「krita」→「pykrita」→「dlg_rect_class」→「dlg_rect_class.py」ファイルで、Extensionクラスを継承した「RectPlugin」クラスを作成します。「dialog」メソッドで「Dialog」クラスのインスタンスを生成して実行します。createActionsメソッドの中でcreateActionメソッドでユニークな(一意の)アクション名"RandomRectAction"を"ランダムに正方形を生成"という名前でアクションを作成します。

「Dialog」クラスの「create_doc」メソッド、「set_value」メソッド、「set_layer」メソッド、「draw_rect」メソッド、「create」メソッドは第12回の「dlg_rect_class.py」のままです。

・サンプルスクリプト「krita」→「pykrita」→「dlg_rect_class」→「dlg_rect_class.py」
# モジュール
from krita import *
from PyQt5.Qt import *
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QDialog, QHBoxLayout,QLabel,QSlider
import random
########## プラグインクラス ##########
class RectPlugin(Extension):
  # 初期化メソッド
  def __init__(self, parent):
    super().__init__(parent)
  # ダイアログ生成
  def dialog(self):
    dlg = Dialog()
    dlg.create()
    dlg.exec_()
  # Krita.instance() exists, so do any setup work
  def setup(self):
    pass
  # called after setup(self)
  def createActions(self, window):
    action = window.createAction("RandomRectAction", "ランダムに正方形を生成")
    action.triggered.connect(self.dialog)
########## 第12回のサンプル「dlg_rect_class.py」とほとんど同じ ##########
class Dialog(QDialog):
  # ドキュメント作成
  def create_doc(self,width,height):
    self.doc = Krita.instance().createDocument(width, height, "Line", "RGBA", "U8", "", 300.0)
    Krita.instance().activeWindow().addView(self.doc)
  # スライダーが動いたら
  def set_value(self,value):
    self.label.setText(str(value))
    self.img = self.draw_rect(value)
    self.set_layer()
    self.doc.refreshProjection()
  # レイヤーのセット
  def set_layer(self):
    root = self.doc.rootNode()
    layer = root.childNodes()[0]
    if self.img.sizeInBytes() == 4 * layer.channels()[0].channelSize() * self.doc.width() * self.doc.height():
      ptr = self.img.bits()
      ptr.setsize(self.img.byteCount())
      layer.setPixelData(QByteArray(ptr.asstring()), 0, 0, self.doc.width(), self.doc.height())
    else:
      print('Error')
  # 正方形の描画
  def draw_rect(self,size):
    pixmap = QPixmap(self.doc.bounds().size())
    pixmap.fill(QColor(255,255,255,255))
    painter = QPainter()
    painter.begin(pixmap)
    for i in range(0,1080):
      color = QColor.fromHsl(0, 255, 255, 255)
      pen = QPen(color)
      painter.setPen(pen)
      color = QColor.fromHsl(i%360, 255, 128, 255)
      brush = QBrush(color)
      painter.setBrush(brush)
      x = random.randint(0,self.doc.width()-size)
      y = random.randint(0,self.doc.height()-size)
      painter.drawRect(x,y,size,size)
    painter.end()
    return pixmap.toImage()
  # メイン処理
  def create(self):
    self.create_doc(800,800)
    layout = QHBoxLayout()
    self.label = QLabel("0") 
    layout.addWidget(self.label)
    self.slider = QSlider(Qt.Horizontal)
    layout.addWidget(self.slider)
    self.setLayout(layout)
    self.slider.valueChanged.connect(self.set_value)

【サンプルスクリプトの解説】
krita、PyQt5、randomモジュールを読み込みます。
Extensionクラスを継承したプラグインのRectPluginクラスを宣言します。
__init__メソッドで初期化します。
dialogクラスでDialogのインスタンスを生成し、DialogクラスのスライダーUIと正方形の描画を実行します。
setupメソッドでセットアップします。
createActionsメソッドでdialogメソッドをフックします。

UIを使ったプラグインの初期化ファイル

プラグインに拡張する「krita」→「pykrita」→「dlg_rect_class」→「__init__.py」ファイルで、先ほどの「dlg_rect_class.py」ファイルをモジュールとして読み込みます。RectPluginクラスが「dlg_rect_class.py」のExtensionクラスを継承したクラスです。RectPluginは「import」の後と「addExtension()」の中の2ヶ所に書きます(図6)。

図6:dlg_rect_classの階層図

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

Krita.instance().addExtension(RectPlugin(Krita.instance()))

UIを使ったプラグインのエントリー

Pythonスクリプトをプラグインにエントリーするための「krita」→「pykrita」→「dlg_rect_class.desktop」ファイルです。「X-KDE-Library」にプログラムの「dlg_rect_class」をセットし、「Name」にメニュー名を、「Comment」に説明を書きます。

・サンプルスクリプト「krita」→「pykrita」→「dlg_rect_class.desktop」
[Desktop Entry]
Type=Service
ServiceTypes=Krita/PythonPlugin
X-KDE-Library=dlg_rect_class
X-Python-2-Compatible=false
Name=ランダムに正方形を生成
Comment=ランダムに多数の正方形を描画するプラグイン

ショートカットキーをセットする

ショートカットキーをセットするには「プログラム名.action」ファイルをリソースフォルダに「actions」フォルダを作って次のファイルを配置します。

「krita」→「actions」→「dlg_rect_class.action」ファイルはXML形式のファイルです。「Actions」タグの「text」タグにプラグイン名を書き、「Action」タグにdlg_rect_class.pyファイルのcreateAction()内に書いたユニークな(一意の)アクション名「RandomRectAction」を書きます。「Action」タグの「text」タグにプラグイン名、「icon」タグに使用可能なアイコンの名前、「text」タグにショートカットエディタの中で表示されるテキスト、「whatsThis」タグにヘルプアクションを呼び出した時に表示されるテキスト、「toolTip」タグにマウスをかざすと表示されるツールチップ、「iconText」タグにツールバーで表示される文字列、「activationFlags」タグにアクションを無効にするかどうか、「activationConditions」タグに有効化の条件、「shortcut」タグにデフォルトのショートカット、「isCheckable」タグにチェックボックスかどうか、「statusTip」タグにステータスバーに表示されるステータスチップをセットします。

次のサンプルスクリプトをスクリプティングしてKritaを再起動し、「新しい画像」を開始して「カスタムドキュメント」を「作成」します。それからshortcutタグにセットした[Ctrl]キー+[Alt]キー+[Shift]キー+[D]キーを全て押すとショートカットキーが実行されます。スライダーUIが表示され、スライダーをドラッグすると正方形がランダムに描画されます。

・サンプルスクリプト「krita」→「actions」→「dlg_rect_class.action」
<?xml version="1.0" encoding="UTF-8"?>
<ActionCollection version="2" name="Scripts">
    <Actions category="Scripts">
        <text>Roxigaのプラグイン</text>

        <Action name="RandomRectAction">
        <icon></icon>
        <text>ダイアログFontプラグイン</text>
        <whatsThis>ヘルプアクションを呼び出した時に表示されるテキスト</whatsThis>
        <toolTip>マウスをかざすと表示されるツールチップ</toolTip>
        <iconText>ツールバーで表示される文字列</iconText>
        <activationFlags>10000</activationFlags>
        <activationConditions>0</activationConditions>
        <shortcut>ctrl+alt+shift+d</shortcut>
        <isCheckable>false</isCheckable>
        <statusTip>ステータスバーに表示されるステータスチップ</statusTip>
        </Action>
    </Actions>
</ActionCollection>

おわりに

今回はPythonスクリプトをプラグインにする方法を解説しました。さらにショートカットを使ってプラグインで追加したメニューをショートカットキーでキーボードから実行できるようにする設定方法を解説しました。

次回は、ついに本連載も最終回となります。もうすでに、Pythonの基本的なことは使いこなせるようになったのではないでしょうか。

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

連載バックナンバー

開発言語技術解説
第14回

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

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

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

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

「Krita」と「Python」のクラスでダイアログを使ってみよう

2025/1/30
第12回の今回は「Krita」の「Python」でクラスを使ってダイアログ(QDialog)を継承し、UIを構築する解説をします。

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

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

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

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