如何从 GParam 对象获取参数值
How do I get parameter value from a GParam object
内容:
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
属性 的值是可见的子控件,我希望能够从参数传递给我的回调。但是我一直无法弄清楚如何从 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()
按照 的建议,我尝试了 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
,但我仍然不知道如何获取值本身。
我认为这是因为那里不存在。你在 param
中得到的似乎是一个 GParamSpec
,它只是关于参数的元数据,包含它的名称、类型、标志......我在 GParamObject
中找不到参考PyGObject 文档。但是如果我查看 notify
信号的 C 文档,确实,那里传递的是 GParamSpec
,所以它可能是 GObject.ParamSpecObject
所以我认为您的 get_visible_child
是正确的选择。使用 GParamSpec
和 stack.get_property(param.name)
.
可能会以更灵活的方式获得相同的结果
更新:
这是修改后的独立示例:
在回调中,我使用了 3 种不同的方式来获取可见的 child,所有这些都有效。它们都是 return 相同的 object 实例,由 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)
可以帮助您了解 object 中的真实内容。
内容: 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
属性 的值是可见的子控件,我希望能够从参数传递给我的回调。但是我一直无法弄清楚如何从 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()
按照 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
,但我仍然不知道如何获取值本身。
我认为这是因为那里不存在。你在 param
中得到的似乎是一个 GParamSpec
,它只是关于参数的元数据,包含它的名称、类型、标志......我在 GParamObject
中找不到参考PyGObject 文档。但是如果我查看 notify
信号的 C 文档,确实,那里传递的是 GParamSpec
,所以它可能是 GObject.ParamSpecObject
所以我认为您的 get_visible_child
是正确的选择。使用 GParamSpec
和 stack.get_property(param.name)
.
更新:
这是修改后的独立示例:
在回调中,我使用了 3 种不同的方式来获取可见的 child,所有这些都有效。它们都是 return 相同的 object 实例,由 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)
可以帮助您了解 object 中的真实内容。