如何从GParam对象获取参数值

2024-09-28 19:30:00 发布

您现在位置:Python中文网/ 问答频道 /正文

什么: 带有PyGObject绑定和python2.7的Gtk+3。在

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

背景:我有一个Gtk堆栈,我已经连接了一个回调函数到"notify::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.valueparam.get_value()等等,我能想到的,但是没有用。在

当然,由于stack对象也被传递到我的回调函数中,所以我总是可以做stack. get_visible_child(),但这一点都不好玩,是吗?:天

因此,对GParamObject的任何解释、其预期用途或其使用示例的链接都将非常感谢。在

编辑:这里是一个独立的示例。在

^{pr2}$

按照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,但是我仍然不知道如何获得值本身。在


Tags: 函数childgtkparamvaluestackontype
1条回答
网友
1楼 · 发布于 2024-09-28 19:30:00

我想那是因为那里根本不存在。你在param中得到的似乎是一个GParamSpec,它只是关于一个参数的元数据,包含它的名称、类型、标志。。。我在PyGObject文档中找不到关于GParamObject的引用。但是如果我看一下notify信号的C文档,实际上,这是一个传递给那里的GParamSpec,因此可能是^{}

所以我认为你的get_visible_child是一个好办法。使用GParamSpec和{}可以以更灵活的方式获得相同的结果。在

更新:

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

相关问题 更多 >