日別アーカイブ: 2022/04/24

GTK4: GtkRadioButton to GtkCheckButton

GTK4 は GtkRadioButton が廃止されていた。
え、GTK4 製な gnome-text-editor のメニューにはラジオボタンがあるぞ?
継承元である GtkCheckButton のドキュメントを見てみた。

Gtk.CheckButton

なるほど、GtkCheckButton に統合されたってことなんだね。
グループ化すると自動的に丸い形になるのか、よしやってみよう。

#!/usr/bin/env python3

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

class RadioWin(Gtk.ApplicationWindow):
    '''
        GTK4: GtkRadioButton
    '''
    def __init__(self, a):
        Gtk.ApplicationWindow.__init__(self, application=a)
        vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
        root = None
        for s in ['Leica', 'SIGMA', 'Panasonic']:
            # GtkRadioButton to GtkCheckButton
            r = Gtk.RadioButton(label=s, group=root)
            #r = Gtk.CheckButton(label=s, group=root)
            r.connect('toggled', self.on_radio_toggled)
            if not root:
                root = r
                r.props.active = True
            vbox.pack_start(r, False, False, 0)
            #vbox.append(r)
        self.add(vbox)
        #self.set_child(vbox)
        self.show_all()
 
    def on_radio_toggled(self, button):
        if button.props.active:
            self.props.title = button.props.label

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

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

GTK3

#!/usr/bin/env python3

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

class RadioWin(Gtk.ApplicationWindow):
    '''
        GTK4: GtkRadioButton
    '''
    def __init__(self, a):
        Gtk.ApplicationWindow.__init__(self, application=a)
        vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
        root = None
        for s in ['Leica', 'SIGMA', 'Panasonic']:
            # GtkRadioButton to GtkCheckButton
            #r = Gtk.RadioButton(label=s, group=root)
            r = Gtk.CheckButton(label=s, group=root)
            r.connect('toggled', self.on_radio_toggled)
            if not root:
                root = r
                r.props.active = True
            #vbox.pack_start(r, False, False, 0)
            vbox.append(r)
        #self.add(vbox)
        self.set_child(vbox)
        #self.show_all()
 
    def on_radio_toggled(self, button):
        if button.props.active:
            self.props.title = button.props.label

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

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

GTK4

RadioButton

うん唖然とするくらい同じだ、これなら GTK4 化に困らない。
そんなことより、GTK3 と GTK4 って思っていたより違うんだね。

GTK3 はデフォルトが非表示なせいか最初の toggled シグナルが発生しない。
GTK4 のウインドウのほうが少しだけ大きい、なんでだろう。
非アクティブ時のタイトルバー文字列が GTK4 だと濃いまま。
いやタイトルバーはヘッダーバーにすれば普通に薄くなるみたいですけど。

関係ないけど GtkApplication 部分はコレが一番短く書けるな。
今後のサンプルコードはコレでいこうと思う。

だいぶ GTK4 も解ってきたしまとめや自アプリの GTK4 化を。
したいんだけど Fedora 35 の PyGObject は DnD に不具合があるので。
text/uri-list の取得ができずファイルのドロップで開くことができない。
次の Fedora で修正されているはずなのでそれから本格的に。