2017-10-04 29 views
1

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.valueparam.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_typeGtkWidgetですが、値自体を取得する方法はまだわかりません。

答えて

0

そこには存在しないと思います。 paramにあるものは、その名前、型、フラグを保持しているパラメータに関するメタデータだけのGParamSpecのようです... GParamObjectの参照はPyGObjectのドキュメントにありません。私はnotify信号のCのマニュアルを見ればそれがGObject.ParamSpecObject

かもしれのでしかし、確かに、だから私はあなたのget_visible_childが進むべき道だと思い、そこに渡されGParamSpecのthats。 GParamSpecstack.get_property(param.name)と使用して、より柔軟な方法で同じ結果を得ることができます。

UPDATE:

ここでは、スタンドアロンの例変更です:コールバックで 、私は、すべての作業を可視の子を得るための3種類の方法を使用します。それらはすべて、idによって確認されるように、同じオブジェクトインスタンスを返します。

#!/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): 
    print 'stack.get_visible_child():  {}'.format(id(stack.get_visible_child())) 
    print 'stack.get_property(param.name): {}'.format(id(stack.get_property(param.name))) 
    print 'stack.props.visible_child:  {}'.format(id(stack.props.visible_child)) 

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() 

print vars(param)を使用すると、あなたのオブジェクトに実際に何が含まれているかを確認するのに役立ちます。

+0

GParamSpecは 'Gamel.ParamSpecObject'ではないようですが、' param.get_name() 'は' AttributeError'をスローします。同様に、 'print vars(param)'はTypeErrorをスローします:vars()引数には__dict__属性が必要です ' ' GParamSpec'はただのメタデータだと思います。 – KCJ

+0

興味深い。コードサンプルをスタンドアロンのサンプルに更新すると、おそらく私はそれを並べ替えることができます。オブジェクトを持っていて、それが何であるか分からないのは奇妙です.BTW、 'print vars(param)'がうまくいかない場合、 'print dir(param)'を試してみてください。 – liberforce

+0

私はスタンドアロンの例を追加しました。 'print dir(param)'は素晴らしいアイデアでした。ありがとう! – KCJ

関連する問題