月別アーカイブ: 2022年5月

GTK4: TextView

Fedora 36 には adwaita-1-demo が最初から入っていると以前書いた。
GTK Demo(gtk4-demo) は gnome-softwere から入手できるので入れてみる。

demo

なんか勝手に 4 ヶも入ってしまったけどまあいい。
こっちはソースが直接見られるので解りやすいですね。

demo

TextView は文字列中に Widget を入れることができるのか。
よし PyGObject でやってみよう。

#!/usr/bin/env python3

import gi
gi.require_version('Gtk', '4.0')
from gi.repository import Gtk

class Win(Gtk.ApplicationWindow):
    '''
        GTK4: TextView in Button
    '''
    def __init__(self, a):
        Gtk.ApplicationWindow.__init__(self, application=a)
        # Button
        button = Gtk.Button(label='Button')
        button.connect('clicked', self.on_button_clicked)
        # TextView
        self.view = Gtk.TextView()
        buf = self.view.get_buffer()
        it = buf.get_start_iter()
        buf.insert(it, 'This')
        anchor = buf.create_child_anchor(it)
        self.view.add_child_at_anchor(button, anchor)
        buf.insert(it, 'click!')
        # pack
        sw = Gtk.ScrolledWindow()
        sw.set_child(self.view)
        self.set_child(sw)
        self.set_default_size(400, 300)

    def on_button_clicked(self, button):
        with open(__file__) as f:
            s = f.read()
            self.view.props.buffer.set_text(s)

def app_activate(a):
    w = Win(a)
    w.present()

app = Gtk.Application()
app.connect('activate', app_activate)
app.run()

demo

マジでできた、必要性は疑問だけど。
他 tag の利用方法なんかもコレで解るね。
GTK4 はこんな感じで勉強すればいいと思います。

ところで SVG エディタなんだけど。
Vectornator という Mac のアプリを使うことにしました。
M1 Mac なのに Raw 現像専用じゃもったいない。

Tanbo

今日の五条川、とその周辺田圃。

hiwa

カワラヒワ、現在五条川が増水中で他の鳥がなんもおらん。
田植えの時期なのでしかたがない、カワセミはいずこ。

hibari

ヒバリの雄、ということで田圃へ移動。
時期が時期なので農家車の往来が激しい。

hibari

ヒバリの雌、ごはんゲットしたようです。
農家の邪魔かな、だけど公園にヒバリはおらん。

keri

ケリ、相変わらずこの鳥はピントが合わないので下の土手にピントを。
上手く被写界深度が合ってくれたけど鳥認識があればイケるのだろうか?

kiji

キジ、いや実は先週のなんだけど今日はいなかった。
先週はコイツしか撮れなかったので今日まとめて。

しかし M1 Mac はマジで写真編集にしか使っていないなぁ。
GTK4 が一段落したらコッチも、一段落するのかどうか怪しいけど。

GTK4: Clipboard

ビックリ、Fedora 36 に何故か Python2 が入っていた!

gimp

Gimp にくっ付いてきたのか、PyGtk まで。
てか Gimp で使う Python って 2 のままなのかよ。

そりゃ Gimp 自体が GTK2 だし。
GTK って今は GNU Tool Kit という意味だし。
もしかして開発止まっている?
別の SVG エディタを探すか、mac で探したほうがいいような。

ということで平日は軽く GTK4 でクリップボード。

#!/usr/bin/env python3

import gi
gi.require_version('Gtk', '4.0')
from gi.repository import Gtk, Gdk

class Win(Gtk.ApplicationWindow):
    '''
        GTK4: Clipboard Copy and Peast
    '''
    def __init__(self, a):
        Gtk.ApplicationWindow.__init__(self, application=a)
        # Copy Button
        cbutton = Gtk.Button(label='Copy')
        cbutton.connect('clicked', self.on_button_c_clicked)
        # Paste Button
        pbutton = Gtk.Button(label='Paste')
        pbutton.connect('clicked', self.on_button_p_clicked)
        # Entry
        self.entry = Gtk.Entry()
        #pack
        box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
        box.append(cbutton)
        box.append(pbutton)
        box.append(self.entry)
        self.set_child(box)

    def on_button_c_clicked(self, button):
        # entry text
        text = self.entry.get_buffer().get_text()
        clipboard = button.get_clipboard()
        clipboard.set(text)

    def on_button_p_clicked(self, button):
        clipboard = button.get_clipboard()
        clipboard.read_text_async(None, self.on_read_text_async)

    def on_read_text_async(self, clipboard, res):
        text = clipboard.read_text_finish(res)
        self.entry.get_buffer().set_text(text, -1)

def app_activate(a):
    w = Win(a)
    w.present()

app = Gtk.Application()
app.connect('activate', app_activate)
app.run()

文字列以外はあまり使わないと思うので文字列特化。

最初 init で文字列を入れようとしたけど全然駄目だった。
クリップボードは init を抜けてから操作しましょう。

GtkClipboard が GdkClipboard に代わっているけど GTK3 とほぼ同じ。
get_clipboard はどの Widget でもいいみたい、変な感じだけど。
set_text がバインドされていなくて戸惑うけど実はコレでいい。
読み込みは非同期にしないと上手くいかないみたい。

WordPress が 6.0 になった動作確認書き込みでした。

GNOME Adw

GNOME には GTK+ だけでなく Adw というものもあります。

Adw ? 1

モダンな GNOME アプリを作る GTK4 ベースな部品だそうです。
Fedora 36 にはデモアプリが最初から入っています、以下のコマンドで。

$ adwaita-1-demo

adw_demo

この demo のソースは以下にあります。

demo ? main ? GNOME / libadwaita ? GitLab

他にサンプルコードが以下にありました。

examples ? 2bf94101 ? GNOME / libadwaita ? GitLab

かなーり解り辛いです、Linux はこんなもんです。
細かいことはリンク先のソースや英語を読んでもらうとして。

#!/usr/bin/env python3

import gi
gi.require_version('Gtk', '4.0')
gi.require_version('Adw', '1')
from gi.repository import Gtk, Adw

class Win(Adw.ApplicationWindow):
    '''
        Adw: Sample Code
    '''
    def __init__(self, a):
        # Set Adwaita Style
        manager = Adw.StyleManager.get_default()
        manager.set_color_scheme(Adw.ColorScheme.DEFAULT)
        # init
        Gtk.ApplicationWindow.__init__(self, application=a)
        # TitleBar
        titlebar = Adw.HeaderBar()
        # Tab
        view = Adw.TabView()
        tabbar = Adw.TabBar(view=view, autohide=False)
        # First Page
        label = Gtk.Label(label='First Page\nPress Alt+2')
        page1 = view.append(label)
        page1.set_title('tab1')
        # Second Page
        button = Gtk.Button(label='This is Button\nShow Toast', vexpand=True, halign=Gtk.Align.START)
        button.connect('clicked', self.on_button_clicked)
        page2 = view.append(button)
        page2.set_title('tab2')
        # Toast
        self.toast = Adw.ToastOverlay(child=view)
        # pack
        box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
        box.append(titlebar)
        box.append(tabbar)
        box.append(self.toast)
        self.set_content(box)
        self.set_default_size(400, 300)

    def on_button_clicked(self, button):
        toast = Adw.Toast(title='This is a Toast Message')#, priority=Adw.ToastPriority.HIGH, timeout=0)
        self.toast.add_toast(toast)

def app_activate(a):
    w = Win(a)
    w.present()

app = Gtk.Application()
app.connect('activate', app_activate)
app.run()

色々試してみました。

adw

まず Adw.StyleManager で DEFAULT を指定します。
無くても動きますがコレをやらないとこの見た目にはなりません。

AdwWindow という GtkWindow のサブクラスがあります。
なんとタイトルバーがありません、set_titlebar 関数すら省かれている。
GtkBox と AdwHeaderBar を使えばタイトルバーは再現できるようです。
GtkHeaderBar を入れても普通に動きます。

部品設置には set_child ではなく set_content を使います。
普通に GtkWidget が配置できます、何故関数名を変えたのか解りません。
正直、存在意義がよく解らないけど理由があるんだろうなって。

Adw.TabView

AdwTabView は設置しただけでリンク先のショートカットが有効になる。
便利だけれど AdwTabBar を配置すると Ctrl+PageDown は動作しなかった。
いや普通 Alt+数値キーですよね、Google Chrome や Gedit もそうですし。

Adw.Toast

GtkOverLay を駆使するより簡単にアプリ内 Notify が可能です。
Adw.StyleManager を指定しないと背景が無い残念な Notify になる。
これは便利ですね、ただ Nautilus のように上から出せないのかな?

これ以外は demo をご覧ください。
サンプルコードはこの demo くらいしかありませんでした。

Python switch (match)

Python コードを書いていて文字列前後の空白を削除する必要があった。
うっかり trim() と書いたんですけど、こんな例外が。

trim

教えてくれてありがとう、Python では strip() でしたね。
いやぁ筆者を含めて Javascript と混同する人が多いんだろうな。
てかいつのまにこんな親切な例外表示になったんだ?

What’s New In Python 3.10 ? Python 3.10.4 ドキュメント

特に記述は無いけど Better error messages の一つかな。

そんなこんなで上記ページを初めて見たんですけど。
あら Python にもとうとう switch 文が、いや match ですけど。
と思ったんですけど何か変。

break いらないの?

#!/usr/bin/gjs

function func(num) {
    switch(num) {
        case 1:
            print('one');
            //break;
        case 1:
            print('once again');
            //break;
        default:
            print('default!');
    }
}

func(1);

/* output
one
once again
default!
*/

switch 文だとこうなる、C 言語等も同様。

#!/usr/bin/env python3

def func(num):
    match num:
        case 1:
            print('one')
        case 1:
            print('nce again')
        case _:
            print('default!')

func(1)

''' output
one
'''

なるほど、だから switch ではなく match か。

というかコレ if-elif-else の別表記でしかないんだな。
以上とか未満みたいな case はできないみたいだし使い所は微妙。
読みやすくなるかわりに階層が深くなるデメリットも。

でも一番問題なのは。。。。。
Gedit や gnome-text-editor で現状では強調表示されないことかも。

# Gedit
/usr/share/gtksourceview-4/language-specs/python3.lang

# gnome-text-editor
/usr/share/gtksourceview-5/language-specs/python3.lang

に自分で追記すればイケるはず、必要ならばだけど。
4 が GTK3 で 5 が GTK4 なのよ、バージョンがややこしくなったもんだ。