我无法使用g_object_get获取GtkImage上的“file”属性,也无法获取g_object_get_property

时间:2013-07-28 23:37:32

标签: c gtk glade

我在GtkEventBox中有一个GtkImage,在glade上定义

 <object class="GtkEventBox" id="eb_paciente">
    <signal name="button-press-event" handler="print_filepath" object="bt_icn_paciente" swapped="no"/>
    <child>
      <object class="GtkImage" id="bt_icn_paciente">
       <property name="pixbuf">img/patient_icons/icon_patient.png</property>
      </object>
    </child>
  </object>

我要做的是在单击EventBox时更改图像路径。

我在创建事件框硬编码之前就这样做了,并且像魅力一样工作。但现在我无法获得“文件”属性。我已经尝试了两种方式,使用g_object_getg_object_get_property,但我总是得到一个NULL对象作为响应,而不是文件名。

这是我的代码

gboolean print_filepath(GtkWidget *widget, GdkEvent  *event, gpointer *data){
  GValue value = G_VALUE_INIT;

  g_value_init (&value, G_TYPE_STRING);
  g_object_get_property(G_OBJECT(gtk_bin_get_child(GTK_EVENT_BOX(widget))), "file", &value);
  g_print("\n print_filepath = %s\n",  g_value_get_string(&value));

  gchar *filepath;
  g_object_get(G_OBJECT(data), "file", &filepath, NULL);
  g_print("\n print_filepath = %s\n", filepath);
  g_free(filepath);

  return FALSE;
}

我在互联网上进行了深入搜索,但没有发现任何相关信息。我正在试图找出另一种解决方案来实现我想要的但我不知道该怎么做。我将不胜感激任何帮助或建议。 单击事件框时,如何更改图像文件? 非常感谢!

2 个答案:

答案 0 :(得分:1)

重点是您或者GtkBuilder不初始化file对象的GtkImage属性。因此,您可以获得预期的默认值file,即NULL

相反,glade似乎默认将pixbuf属性设置为文件路径。这完全有效,并记录在参考文献的GtkBuilder UI Definitions部分:

  

可以将Pixbufs指定为要加载的图像文件的文件名

我改变了行

<property name="pixbuf">img/patient_icons/icon_patient.png</property>
你的ui定义文件的

<property name="file">img/patient_icons/icon_patient.png</property>

并且它在我的系统上最初的预期效果。

答案 1 :(得分:0)

来自user1146332的回答 改变这条线

<property name="pixbuf">img/patient_icons/icon_patient.png</property>

<property name="file">img/patient_icons/icon_patient.png</property>

将允许您获取文件名。谢谢你。

在python中,你得到如下文件名:

ImageFileName = widget.get_property('file')

如果您计划在林间空地上进行设计并修改* .glade文件。你必须每次都修改它。 这是一些“修复”该文件的代码。我已经用Python完成了它,如果它适用于任何人。

from lxml import etree
import xml.etree.ElementTree as ET

class ModifyXML:
    def ChangePropertyPixbuf():


    print("start")


#____________________________________________


        tree = ET.parse("test image.glade")

        root = tree.getroot()


        for ChgValue in root.findall(".//*[@class='GtkImage']"):

            ChgValueb = ChgValue.find(".//*[@name='pixbuf']")

            if ChgValueb is not None:

                ValueOfb = ChgValueb.text

                if ChgValueb.text != "" : ChgValue.remove(ChgValueb)

                ChgValueb = ET.SubElement(ChgValue,'property')

                ChgValueb.set("name", "file")

                ChgValueb.text = ValueOfb

        tree.write("test image.glade")

#_________________________________________

print("done")


ModifyXML.ChangePropertyPixbuf()