Paepoi

Paepoi » GTK4(Python) Tips » GTK4(Python) Tips | Adw

GTK4(Python) Tips | Adw

# 最終更新日 2023.05.14

Adwaita Style
GTK4 で作成されたアプリは Adwaita の統一されたスタイルになっています。
以下のように AdwStyleManager を設定するだけで適用されるようになります。
又ダークテーマへの追従もこれで指定できます。
#!/usr/bin/env python3

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

class Win(Gtk.ApplicationWindow):
    '''
        PREFER_LIGHT PREFER_DARK は意味が無い
    '''
    def __init__(self, a):
        Gtk.ApplicationWindow.__init__(self, application=a)
        # Set Adwaita Style
        manager = Adw.StyleManager.get_default()
        # ダークテーマを OS の設定に追従させる
        #manager.set_color_scheme(Adw.ColorScheme.DEFAULT)
        # 常にダークテーマ
        manager.set_color_scheme(Adw.ColorScheme.FORCE_DARK)
        # 常にライトテーマ
        #manager.set_color_scheme(Adw.ColorScheme.FORCE_LIGHT)
        #
        label = Gtk.Label(label='ダークテーマ')
        self.set_child(label)

app = Gtk.Application()
app.connect('activate', lambda a: Win(a).present())
app.run()
dark.webp

Toast
昔ながらのトースターで食パンが跳ね上がるようにメッセージを出すウイジェット。
Adw.ToastOverlay の内部に Adw.Torst を作り add_toast で表示させます。
Adwaita スタイルにしないと上手く動作しませんので注意。
#!/usr/bin/env python3

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

class Win(Gtk.ApplicationWindow):
    '''
        GTK4: No Decorated Window
    '''
    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)
        # Button
        button = Gtk.Button(label='Show Toast', halign=Gtk.Align.CENTER, valign=Gtk.Align.CENTER)
        button.connect('clicked', self.on_button_clicked)
        # Toast
        self.toast = Adw.ToastOverlay(child=button)
        self.set_child(self.toast)
        self.set_default_size(200, 200)

    def on_button_clicked(self, button):
        toast = Adw.Toast(title='Hello World')
        self.toast.add_toast(toast)

app = Gtk.Application()
app.connect('activate', lambda a: Win(a).present())
app.run()
toast.webp

MessageDialog
GtkMessageDialog が廃止された代わりに Adw に用意されました。
形やレスポンスに特別な定義は無くすべて文字列でのやりとりになっています。
#!/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(Gtk.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)
        # Button
        button = Gtk.Button(label='Message Dialog', halign=Gtk.Align.CENTER, valign=Gtk.Align.CENTER)
        button.connect('clicked', self.on_button_clicked)
        # Toast
        self.toast = Adw.ToastOverlay(child=button)
        self.set_child(self.toast)
        self.set_default_size(200, 100)

    def on_button_clicked(self, button):
        dlg = Adw.MessageDialog.new(self, '何が撮りたい?', '選んでください')
        dlg.add_response('bird', '野鳥(_b)')
        dlg.add_response('portrait', 'ヌード(_p)')
        dlg.add_response('train', '電車(_d)')
        dlg.connect('response', self.on_message_response)
        dlg.present()

    def on_message_response(self, dlg, response):
        match response:
            case 'bird':
                toast = Adw.Toast(title='変態!')
            case 'portrait':
                toast = Adw.Toast(title='エッチ!')
            case 'train':
                toast = Adw.Toast(title='キチガイ!')
            case 'close':
                toast = Adw.Toast(title='Esc かよ!')
            case _:
                toast = Adw.Toast(title='不明...')
        self.toast.add_toast(toast)

app = Gtk.Application()
app.connect('activate', lambda a: Win(a).present())
app.run()
message.webp

AboutDialog
gnome-text-editor や nautilus で採用されている About です。
GtkAboutDialog 同様にプロパティを埋めていくだけで作れます。
#!/usr/bin/env python3

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

class Win(Gtk.ApplicationWindow):
    '''
        このダイアログのデフォルトは非表示になっています
    '''
    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)
        # Button
        button = Gtk.Button(label='Show About', halign=Gtk.Align.CENTER, valign=Gtk.Align.CENTER)
        button.connect('clicked', self.on_button_clicked)
        self.set_child(button)

    def on_button_clicked(self, button):
        d = Adw.AboutWindow(
            developer_name='sasakima-nao',
            developers=['sasakima-nao'],
            copyright='© 2023 sasakima-nao',
            license_type=Gtk.License.GPL_2_0,
            #application_icon='org.sasakima.Comipoli',
            application_name='Comipoli',
            version='0.0.1',
            website='http://palepoli.skr.jp/',
            modal = True,
            transient_for=self)
        d.set_visible(True)

app = Gtk.Application()
app.connect('activate', lambda a: Win(a).present())
app.run()
about.webp

Copyright(C) sasakima-nao All rights reserved 2002 --- 2023.