Paepoi » GTK4(Python) Tips » GTK4(Python) Tips | C 言語からの変換
GTK4(Python) Tips | C 言語からの変換
# 最終更新日 2022.04.24
PyGObject は require しなければ自動的に新しいバージョン側を参照します。
ただし警告を stderr に吐くので require_version は必ず行いましょう。
C 言語とほぼ同様になっています。
オブジェクト作成時の引数にプロパティをデフォルト引数の形で指定する。
C の関数で第一引数を除いたものを指定します、NULL でいいものは省略可能。
関数自体に戻り値がある場合は最初に戻り値を含んだタプルになる。
下記のように PyGtk と同様にセットすることもできるようです。
オブジェクト作成時に __init__ が実行され継承元の初期化が必要なことも同じ。
又は「ボタンを押した」等をユーザーが行った場合に発生するメッセージ。
そのシグナルに対応するハンドラを作成して処理を行います。
クラスにした場合は do_ のプレフィックスでオーバーライドもできます。
import
gir を使って GTK4 を参照するには以下のように書きます。PyGObject は require しなければ自動的に新しいバージョン側を参照します。
ただし警告を stderr に吐くので require_version は必ず行いましょう。
''' /usr/lib64/girepository-1.0/Gtk-4.0.typelib を参照するコード、gi.repository を経由する ''' import gi gi.require_version('Gtk', '4.0') from gi.repository import Gtk
関数
関数の書き方は基本的に Gtk からドットで繋ぐだけ。C 言語とほぼ同様になっています。
'''C g_printf("%u\n", gtk_get_major_version()); ''' print(Gtk.get_major_version())
オブジェクト作成
オブジェクトも C 言語とほぼ同様に作成できます、ただし gir では推奨されない。オブジェクト作成時の引数にプロパティをデフォルト引数の形で指定する。
'''C GtkButton *button; button = gtk_button_new_with_label("new"); ''' # この書き方でも作成できるけど gir では推奨されない button = Gtk.Button.new_with_label('new') # # 下記のように label プロパティをデフォルト引数形式で指定 button = Gtk.Button(label='label プロパティに代入しています')
メソッド
関数を使ってオブジェクトに命令を出す場合はオブジェクトのメソッドで指定できます。C の関数で第一引数を除いたものを指定します、NULL でいいものは省略可能。
'''C gtk_window_set_default_size (mywindow, 300, 400); ''' mywindow.set_default_size(300, 400)
戻り値、引数
引数で値を得る形式の関数はタプルとして戻り値となる。関数自体に戻り値がある場合は最初に戻り値を含んだタプルになる。
''' C int width; int height; gtk_window_get_default_size (window, &width, &height); ''' width, height = window.get_default_size()
プロパティ
プロパティを読み書きする方法に props メソッドがあります。下記のように PyGtk と同様にセットすることもできるようです。
'''C g_object_set_property(button, "use-underline", FALSE); ''' # ハイフンはアンダーラインに変換して指定 button.props.use_underline = True # C ライクなコチラも使えます button.set_property('use-underline', False)
列挙体
列挙体は大体こんな感じで変換できます。''' typedef enum { GTK_ORIENTATION_HORIZONTAL, GTK_ORIENTATION_VERTICAL } GtkOrientation; ''' Gtk.Orientation.HORIZONTAL
クラス
サブクラスは普通に Python の class が使えます。オブジェクト作成時に __init__ が実行され継承元の初期化が必要なことも同じ。
class RedLabel(Gtk.Label): def __init__(self): Gtk.Label.__init__(self, use_markup=True) def set_red_text(self, text): self.label = f'<span fgcolor="red">{text}</span>' warn = RedLabel() warn.set_red_text('Warnning!')
シグナル
シグナルは「アプリがアクティブ化した」や「サイズが変更された」等の通知。又は「ボタンを押した」等をユーザーが行った場合に発生するメッセージ。
そのシグナルに対応するハンドラを作成して処理を行います。
クラスにした場合は do_ のプレフィックスでオーバーライドもできます。
#!/usr/bin/env python3 import gi, sys gi.require_version('Gtk', '4.0') from gi.repository import Gtk class App(Gtk.Application): ''' このアプリはウインドウを作らないので即終了します ''' def __init__(self): Gtk.Application.__init__(self) '''C g_signal_connect(G_OBJECT(app), "startup", G_CALLBACK(startup_cb), NULL); ''' self.connect('startup', self.startup_cb) def startup_cb(self, app): ''' connect の場合はパラメータは user_data 以外全部必要 ''' Gtk.Application.do_startup(app) print('startup 受信') def do_activate(self): ''' オーバーライドの場合は先頭のパラメータは不要 ''' print('activate 受信') app = App() app.run(sys.argv)
Copyright(C) sasakima-nao All rights reserved 2002 --- 2024.