What: PyGObjectバインディングとPython 2.7を使用したGtk + 3。GParamオブジェクトからパラメータ値を取得する方法
質問: GParamObject
の値はどのようにして取得できますか?私はそれが価値があると思っています(それ以外の点は何でしょうか?)しかし、私は数時間にわたりグーグルで実験をしてきましたが、この一見単純な質問に対する答えを見つけることができませんでした。多分私の前提に価値があるのは根拠がありません。
背景:私はGtk.Stackを持っている、と私はvisible-child
変更いくつかのものをし"notify::visible-child"
信号にコールバックを接続しています。 GTK.Stack docs以来、今、この
stack.connect("notify::visible-child", on_stack_changed)
def on_stack_changed(stack, param):
print "stack's visible child changed"
print param # Prints: <GParamObject 'visible-child'>
のようなものは、私は私のコールバックに渡されたのparamからウィジェットへの参照を取得できることを期待し、visible_child
プロパティの値が表示される子ウィジェットであることを示しています。しかし、私はGParamオブジェクトからどのように値を取得するかを理解できませんでした。
param.value
、param.get_value()
など私が考えることができるもののようなあらゆるバリエーションを試しましたが、無駄です。
もちろん、スタックオブジェクトもコールバックに渡されるので、いつもstack. get_visible_child()
を実行できますが、これは楽しいことではありませんか? :D
GParamObject
の説明、その意図された使用、またはその使用例へのリンクは非常に認められます。
編集:ここはスタンドアロンの例です。
#!/usr/bin/env python
import os, gi
gi.require_version('Gtk', '3.0')
gi.require_version('Gdk', '3.0')
from gi.repository import Gtk, Gdk
def on_stack_changed(stack, param):
for attr in dir(param):
print "{}: {}".format(attr, getattr(param, attr))
stack = Gtk.Stack()
stack.add_titled(Gtk.Label('Child 1'), 'child1', 'Child 1')
stack.add_titled(Gtk.Label('Child 2'), 'child2', 'Child 2')
stack.connect("notify::visible-child", on_stack_changed)
stack_switcher = Gtk.StackSwitcher(stack=stack)
header_bar = Gtk.HeaderBar(custom_title=stack_switcher, show_close_button=True)
window = Gtk.Window()
window.set_default_size(500, 250)
window.set_titlebar(header_bar)
window.add(stack)
window.connect('destroy', Gtk.main_quit)
window.show_all()
Gtk.main()
liberforceによって示唆されるように、私は、この出力になりprint dir(param)
を試してみました:
__doc__: The widget currently visible in the stack
__gtype__: <GType GParamObject (94151103218704)>
blurb: The widget currently visible in the stack
flags: 1073742051
name: visible-child
nick: Visible child
owner_type: <GType GtkStack (94151105445744)>
value_type: <GType GtkWidget (94151104851072)>
これはGParamObject
から利用可能なものの情報の理解に大いに役立ちます。予想通り、value_type
はGtkWidget
ですが、値自体を取得する方法はまだわかりません。
GParamSpecは 'Gamel.ParamSpecObject'ではないようですが、' param.get_name() 'は' AttributeError'をスローします。同様に、 'print vars(param)'はTypeErrorをスローします:vars()引数には__dict__属性が必要です ' ' GParamSpec'はただのメタデータだと思います。 – KCJ
興味深い。コードサンプルをスタンドアロンのサンプルに更新すると、おそらく私はそれを並べ替えることができます。オブジェクトを持っていて、それが何であるか分からないのは奇妙です.BTW、 'print vars(param)'がうまくいかない場合、 'print dir(param)'を試してみてください。 – liberforce
私はスタンドアロンの例を追加しました。 'print dir(param)'は素晴らしいアイデアでした。ありがとう! – KCJ