2017-10-04 39 views
1

什么是: Gtk + 3与PyGObject绑定和Python 2.7。如何从GParam对象获取参数值

问题: 如何获取GParamObject的值?我认为它有一个值,(否则会是什么的地步呢?),但我已经花了几个小时,谷歌搜索和试验,并一直无法找到答案,这个看似简单的问题。也许我的假设是有一个值是没有根据的。

背景:我有一个Gtk.Stack,我已经连接回调到"notify::visible-child"信号,做一些东西visible-child变化时。事情是这样的

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'> 

现在,由于GTK.Stack docs表明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_typeGtkWidget,但我仍然没有看到如何让本身的价值。

回答

0

我想这是因为它不存在那里。你在param得到似乎是一个GParamSpec这只是有关的元数据参数,持有其名称,类型,标志......我找不到PyGObject文档上GParamObject参考。但是,如果我看notify信号的C文件,的确,这就是传递那里GParamSpec,所以这可能是一个GObject.ParamSpecObject

因此,我认为你的get_visible_child是要走的路。你可能会使用采用GParamSpecstack.get_property(param.name)更灵活的方式相同的结果。

UPDATE:

这里的修改独立例如: 在回调,我用三种不同的方式获取可见子,所有的工作。它们都返回相同的对象实例,如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似乎并不成为一个'GObject.ParamSpecObject'如'param.get_name()'抛出'AttributeError'。同样'打印瓦尔(PARAM)''抛出类型错误:瓦尔()参数必须有__dict__ attribute' 我认为你是对的'GParamSpec'就是元数据。 – KCJ

+0

有趣。如果你更新你的代码示例以获得独立的示例,也许我可以将它整理出来。有一个对象很奇怪,而且不知道它是什么......顺便说一句,如果'print vars(param)'不起作用,请尝试'print dir(param)'。 – liberforce

+0

我添加了一个独立的例子,'print dir(param)'是一个好主意。谢谢! – KCJ