如何从GParam对象

时间:2017-10-04 15:56:06

标签: python gtk pygobject

什么: Gtk + 3使用PyGObject绑定和Python 2.7。

问题: 如何获得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属性的值是可见子窗口小部件,我希望能够从传递给我的param中获取对窗口小部件的引用打回来。但是我无法弄清楚如何从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,但我仍然不知道如何获取价值。

1 个答案:

答案 0 :(得分:0)

我认为这是因为那里不存在。您在param中获得的内容似乎是GParamSpec,它只是关于参数的元数据,包含其名称,类型,标记...我在GParamObject中找不到引用PyGObject文档。但是,如果我查看notify信号的C文档,确实是GParamSpec传递给那里,那么可能是GObject.ParamSpecObject

所以我认为你的get_visible_child是要走的路。使用GParamSpecstack.get_property(param.name)时,您可以更灵活地获得相同的结果。

<强>更新

以下是修改后的独立示例: 在回调中,我使用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)可以帮助您查看对象中的内容。