如何更改GTK小部件(如堆栈)的属性?

4 投票
1 回答
3024 浏览
提问于 2025-04-18 06:34

我最近快速浏览了一下GTK 3.10的文档,特别是关于GtkStack的部分。

文档提到,添加到GtkStack中的子元素有一个叫“icon-name”的属性。

我想问的是——我该怎么改变这个属性的值呢?原因是我想把GtkStackSwitcher的按钮改成图标,而不是文字,但我想通过代码来实现,而不是使用GktBuilder的界面。

如果你查看一下gtk3-demo中的Stack演示和UI文件,你会发现GtkSwitcher上有一个图标。

在这里输入图片描述

<?xml version="1.0" encoding="UTF-8"?>
<interface>
  <!-- interface-requires gtk+ 3.6 -->
  <object class="GtkWindow" id="window1">
    <property name="can_focus">False</property>
    <property name="title" translatable="yes">GtkStack</property>
    <child>
      <object class="GtkGrid" id="grid1">
        <property name="visible">True</property>
        <property name="can_focus">False</property>
        <child>
          <object class="GtkStackSwitcher" id="switcher">
            <property name="visible">True</property>
            <property name="stack">stack</property>
            <property name="halign">center</property>
          </object>
          <packing>
            <property name="left_attach">0</property>
            <property name="top_attach">0</property>
            <property name="width">1</property>
            <property name="height">1</property>
          </packing>
        </child>
        <child>
          <object class="GtkStack" id="stack">
            <property name="visible">True</property>
            <property name="can_focus">True</property>
            <property name="transition-type">crossfade</property>
            <child>
              <object class="GtkImage" id="image1">
                <property name="visible">True</property>
                <property name="can_focus">False</property>
                <property name="margin-top">20</property>
                <property name="margin-bottom">20</property>
                <property name="resource">/application/gtk-logo-48.png</property>
              </object>
              <packing>
                <property name="name">page1</property>
                <property name="title" translatable="yes">Page 1</property>
              </packing>
            </child>
            <child>
              <object class="GtkCheckButton" id="checkbutton1">
                <property name="label" translatable="yes">Page 2</property>
                <property name="visible">True</property>
                <property name="can_focus">True</property>
                <property name="receives_default">False</property>
                <property name="xalign">0</property>
                <property name="draw_indicator">True</property>
                <property name="halign">center</property>
                <property name="valign">center</property>
              </object>
              <packing>
                <property name="name">page2</property>
                <property name="title" translatable="yes">Page 2</property>
              </packing>
            </child>
            <child>
              <object class="GtkSpinner" id="spinner1">
                <property name="visible">True</property>
                <property name="can_focus">False</property>
                <property name="halign">center</property>
                <property name="valign">center</property>
                <property name="active">True</property>
              </object>
              <packing>
                <property name="name">page3</property>
                <property name="icon-name">face-laugh-symbolic</property>
              </packing>
            </child>
          </object>
          <packing>
            <property name="left_attach">0</property>
            <property name="top_attach">1</property>
            <property name="width">1</property>
            <property name="height">1</property>
          </packing>
        </child>
      </object>
    </child>
  </object>
</interface>

我在Ubuntu 14.04(Gtk 3.10)下使用python3解释器。

Python 3.4.0 (default, Apr 11 2014, 13:05:11) 
[GCC 4.8.2] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from gi.repository import Gtk
>>> stack = Gtk.Stack()
>>> spin = Gtk.Spinner()
>>> stack.add_named(spin, "spin")
>>> stack.show_all()
>>> child = stack.get_visible_child()
>>> child.props.icon_name = "go-previous"
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'gi._gobject.GProps' object has no attribute 'icon_name'
>>> stack.props.icon_name = "go-previous"
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'gi._gobject.GProps' object has no attribute 'icon_name'
>>> 

正如你所看到的,我在一个堆栈对象中添加了一个GtkSpinner,并尝试访问添加的子元素,然后改变“icon-name”这个属性。

但是没有成功。那么我明显犯了什么错误呢?

1 个回答

12

有一点小但很重要的区别:icon-name 不是 GtkStack 的子元素的“属性”,而是 GtkStack 的“子属性”。

这个区别在于,“子属性”影响的是一个容器和它的某个子控件之间的关系,而不仅仅是影响容器本身或只是影响子控件。

使用这个:

stack.child_set_property(child, 'icon-name', 'go-previous')

撰写回答