先日 Python コードが実行できなくなっていて焦った。
でもソースを他のディレクトリに移動したら普通に動いた。
パーミッションや SE Linux コンテキストは問題無い、あれ?
本日原因が判明。
signal.py というファイルが同一ディレクトリにある、中身は関係ない。
from gi.repository import *** を行う。
という条件を満たすとエラーになる、他の from なら問題ないようだけど。
ついでに __pycache__ も同一ディレクトリに作られてしまう。
import しなくても存在するだけで影響を受ける場合があるんですね。
モジュールに存在するファイル名を付けては駄目というお話でした。
それだけではアレなので。
下記のサンプルコードがいつのまにか GTK4 になっていました。
いつまで GTK3 のまんまなんだよと思っていたけどやっとか。
set_application_name は意味無いだろ、は置いといて。
せっかくこんなネタなので signal の所を見てみよう。
PyGObject で signal の定義はデコレータを付けるだけなのか。
シグナル名は関数名そのままってことでいいのかな、実験してみよう。
#!/usr/bin/env python3 import gi gi.require_version('Gtk', '4.0') gi.require_version('Adw', '1') from gi.repository import Gtk, Adw, GObject class Win(Gtk.ApplicationWindow): def __init__(self, a): manager = Adw.StyleManager.get_default() manager.set_color_scheme(Adw.ColorScheme.DEFAULT) Gtk.ApplicationWindow.__init__(self, application=a) button = Gtk.Button(label='Click!') button.connect('clicked', self.on_button_clicked) self.set_child(button) def on_button_clicked(self, button): self.emit('my_signal') print('Button Signal') @GObject.Signal def my_signal(self): print('My Signal') app = Gtk.Application() app.connect('activate', lambda a: Win(a).present()) app.run()
うん、普通に emit をキャッチできますね。
非同期になるわけではないしこういう使い方では関数と変わらないですが。
自作 widget に signal を実装したい場合こんなに簡単にできるみたいです。
Signals ? Building an Application ? GTK4 + GJS Book
ちなみに Gjs はこう、メンドクセー。
そりゃみんな PyGObject を選ぶよって。
今日は何故か芝生の中でヒバリのメスがハアハアしていました。
暑いなら日陰にいけばいいのに、日陰はカラスが占領していたけど。