2014-05-14 345 views
3

我一直在快速瀏覽GtkStack的GTK 3.10文檔。如何更改GTK窗口小部件(如堆棧)的屬性?

它提到孩子添加到GtkStack被賦予的屬性「圖標名稱」。

我的問題是 - 我怎樣才能改變這個屬性的值。原因 - 我想將GtkStackSwitcher按鈕更改爲圖標而不是文本,但我想編碼 - 不使用GktBuilder用戶界面。

如果你看看gtk3-demo-Stack演示和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> 

使用python3解釋的Ubuntu 14.04(GTK 3.10)

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」屬性。

沒有快樂。那麼我在做什麼是明顯的錯誤?

回答

8

輕微但重要的區別:icon-name不是GtkStack的孩子的「財產」,它是GtkStack的「子財產」。

區別在於「子屬性」會影響容器與其子控件之一之間的關係,而不僅僅是容器或子控件。

使用此:

stack.child_set_property(child, 'icon-name', 'go-previous') 
相關問題