2021年8月5日木曜日

GIMP Script-Py (番外) Python 3 らしく UI を

Windows 版 GIMP 2.99 に付随する Python 3。
其れを使って、GUI の表示を。
GUI とは言うものの、MessagBox を出すだけですが、
GIMP 2 + Python 2 と同じ調子では、上手くは行きませぬ。


何れ、GIMP 3.x の時代が来れば、
GIMP 2.x で書いてあったスクリプトは 大幅に 手直しをする必要があります。
今は Work in Progress !  だと思いますから、 この期間を利用して、
ウォーミングアップ ... の心算だったのですが ... 。
 (故に、仕様変更の可能性も踏まえて、 タイトルは、敢えて、番外 としています。)

此処の処、Python とは離れていましたので、
なかなか、エンジンが掛かりませぬ。

少しずつ、記憶を辿り寄せても、 どうやら、勝手が違うのです。
昔 (GIMP 2.10)と同じ様に書いていては、躓いて仕舞います。

簡単である筈の MessageBox すら、出せ無い ... 。  X(
まったく、もう。

   参考迄に。
   GIMP 2.10 での 同じ作業は 以下の URL を参照下さい。
   GIMP Script-Py (4) Python らしく UI を


キーポイントは GObject ... 。
Gtk だけでは無く、gi (GObject Introspection) が絡んで来ます。
  reflection を低水準、introspection を高水準、そして 内観性 内省性 と説明されている方がいました。
  私は 包括的 と捉えました。
  何故なら、Python Script の import で、真っ先に呼ばれ、
  其れの repository(貯蔵庫 倉庫)から、各種ライブラリを呼ぶから。
  (上記は素人の勝手な思い込みです!)



では、四苦八苦した結果を。、
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk

msg_title = "msg title - gtk"
msg_strings = (" "*120 + "¥n" +
               " "*10 + "first" +"¥n" +
               " "*10 + "   first sub")
msg_strings2 = (" "*120 + "¥n" +
                " "*10 + "second")

def gtk_msg_warning(msg_title, msg_strings, msg_strings_2):
    message = Gtk.MessageDialog(#None,
#                                flags = Gtk.DIALOG_DESTROY_WITH_PARENT,
#                                type = Gtk.MESSAGE_WARNING,
#                                buttons = Gtk.BUTTONS_OK
                                message_type = Gtk.MessageType.WARNING,
                                buttons = Gtk.ButtonsType.OK_CANCEL)
    message.set_title(msg_title)
    message.set_markup(msg_strings)
    message.format_secondary_text(msg_strings_2)
    result = message.run()
    message.destroy()
    return result

gtk_msg_warning(msg_title, msg_strings, msg_strings2)



  上は、GIMP から呼び出した様子。  Dialog 背景は 濃い灰色で、左肩のアイコンも GIMP のものです。
  下は、最初に単独で Python を動かした時の様子。  Dialog の背景色は 白 ですね。
  双方で Dialog の設定が異なっている為、条件違い になりますが、 雰囲気は掴めますでしょうか?。
  Dialog の Size は、与えられた文字列やボタンから自動調整されている事も分かりますね。

少し、補足解説を。
そうそう、其の前に。  此れは GIMP での Python の 説明では ありません!。
Python 単独! に近い と ご理解 下さい。

import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
此の冒頭の3行は Python 3 での お決まりの文 かも。  前とは違いますね。
Gtk を import するにも、gi 経由で無いと動かない様です。

そして、MessageBox を呼び出すのですが、
パラメータも前とは変わっています。
殊に、おや? と思ったのは、第一引数に None が来る様な呼び方だと、怒られて仕舞います。
None は parent 。  そう 親 がいないよ!、と書くてはいけません。
実行時に、None が来る書き方も駄目です。
親から呼ばれる Dialog は Modal 限定になった様です。
開けっ放し は許され無くなった、と。

此処で、不安が過ります。
表示しっぱなし の MessageBox が欲しいのに ... 。
  (表示中に、手作業終了を待機し、押されたボタンで条件分岐 が目論見です。)
はい。  GIMP での Python の挙動をすっかり忘れていました。
GIMP では、Python Script は 別プロセスで独立して動いていて、本体と通信(連携)しています。
親は操作可能な状態の筈。
其れを確かめる為に、GIMP の Python Console から試した訳です。
やはり、GIMP 本体の操作は MessageBox 表示中も可能でした。

子から見て Modal でも、親子で見れば Modeless の様に振舞うのでしたね。
この事を忘れていて、 単独でも Modeless にする方法を必死で探して 答えが見付けられ無い!、と大騒ぎ!。
parent に結び付く 引数 を省略して、やっと、安穏が訪れました。

以前との違いは、アイコン指定が無視されている事。
Waring も、Information も、皆、同じスタイルです。
GIMP 2.99 で エラー が出る時には、アイコン画像がありますので、
何か方法があるのだと思うのですが ... 。
調べると、
image = Gtk.Image()
image.set_from_stock(Gtk.STOCK_CAPS_LOCK_WARNING, Gtk.IconSize.DIALOG)
image.show()
messagedialog.set_image(image)
from https://developer.gnome.org/gnome-devel-demos/stable/messagedialog.py.html.en
と出て来るのですが、
Gtk.MessageDialog:set_image has been deprecated since version 3.12 and should not be used in newly-written code.
by https://athenajc.gitbooks.io/python-gtk-3-api/content/gtk-group/gtkmessagedialog.html
とも書いてあるので ... 採用するか否か、悩む処です。

尚、
実行用の文字列代入は、上の例では、改行やスペースを挿入して、
MessageBox のサイズや文字列位置を調整していますが、
.set_default_size 等で指定した方がスマートなのかも(試してはいません)。

そして、Python を書き慣れた方がご覧になれば、文字列の挿入箇所の記述は、
如何にも 泥臭い Code になっている事と思います。
まぁ、 笑って下さい。  真似しないで下さい。  ;)



0 件のコメント:

コメントを投稿