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

标签 python gtk gtk3 pygobject

我一直在快速浏览 GtkStack 的 GTK 3.10 文档。

它提到添加到 GtkStack 的 child 被赋予了一个属性“icon-name”。

我的问题是 - 如何更改此属性的值。原因 - 我想将 GtkStackSwitcher 按钮更改为图标而不是文本,但我想对此进行编码 - 而不是使用 GktBuilder UI。

如果您查看 gtk3-demo - 堆栈演示和 UI 文件,您可以看到 GtkSwitcher 有一个图标。

enter image description here

<?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 不是 GtkStack 的子项的“属性”,它是 的“子属性” GtkStack.

不同之处在于“子属性”会影响容器与其子小部件之一之间的关系,而不仅仅是容器或子小部件。

使用这个:

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

关于python - 如何更改 GTK 小部件(如堆栈)的属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23662257/

相关文章:

python - Django - 通过 ForeignKey 属性将参数传递给模型

python - 将 C 代码转换为 Python 时语法无效

python - 如何创建包含 threading.Event 和 multiprocessing.Event 的协议(protocol)?

python - 如何删除大型法语文本文件中的所有特殊字符

python - 如何在 Ubuntu 中获取 PyGTK 或 GTK 中打开的窗口列表?

使用glade的C GTK3程序不显示主窗口

c - GTK+ 2 C - 按下输入或单击按钮以从条目小部件获取文本

c - 将 struct 作为 arg 传递给 G_CALLBACK 时收到 GLib 警告

c++ - 使用 vcpkg 安装 GTK3 的主题和图标问题

c++ - gtkmm 的 g_signal_emit 或 g_signal_emit_by_name 版本是什么?