Question

I did this code in glade:

<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.16.0 on Wed Apr 30 19:25:13 2014 -->
<interface>
<!-- interface-requires gtk+ 3.10 -->
  <object class="GtkListStore" id="dinero">
  <columns>
    <!-- column-name extraer -->
    <column type="gint"/>
  </columns>
<data>
  <row>
    <col id="0">20</col>
  </row>
  <row>
    <col id="0">50</col>
  </row>
  <row>
    <col id="0">100</col>
  </row>
  <row>
    <col id="0">200</col>
  </row>
  <row>
    <col id="0">300</col>
  </row>
  <row>
    <col id="0">500</col>
  </row>
</data>
</object>
<object class="GtkListStore" id="tipo_cuenta">
<columns>
  <!-- column-name cuenta -->
  <column type="gchararray"/>
</columns>
<data>
  <row>
    <col id="0" translatable="yes">Cuenta Corriente</col>
  </row>
  <row>
    <col id="0" translatable="yes">Cuenta de Ahorro</col>
  </row>
</data>
</object>
<object class="GtkWindow" id="window1">
<property name="can_focus">False</property>
<child>
  <object class="GtkBox" id="box1">
    <property name="visible">True</property>
    <property name="can_focus">False</property>
    <property name="halign">center</property>
    <property name="valign">start</property>
    <property name="hexpand">True</property>
    <property name="vexpand">True</property>
    <property name="orientation">vertical</property>
    <property name="homogeneous">True</property>
    <child>
      <object class="GtkBox" id="box2">
        <property name="visible">True</property>
        <property name="can_focus">False</property>
        <child>
          <object class="GtkBox" id="box3">
            <property name="visible">True</property>
            <property name="can_focus">False</property>
            <property name="orientation">vertical</property>
            <child>
              <object class="GtkLabel" id="label1">
                <property name="visible">True</property>
                <property name="can_focus">False</property>
                <property name="xpad">80</property>
                <property name="label" translatable="yes">Extraer</property>
              </object>
              <packing>
                <property name="expand">False</property>
                <property name="fill">True</property>
                <property name="position">0</property>
              </packing>
            </child>
            <child>
              <object class="GtkComboBox" id="comboextraer">
                <property name="visible">True</property>
                <property name="can_focus">False</property>
                <property name="halign">center</property>
                <property name="valign">center</property>
                <property name="model">dinero</property>
                <property name="wrap_width">3</property>
                <property name="row_span_column">3</property>
                <property name="column_span_column">3</property>
                <property name="active">0</property>
                <property name="button_sensitivity">on</property>
                <property name="id_column">0</property>
                <property name="active_id">extraer</property>
                <child>
                  <object class="GtkCellRendererText" id="lista_extraer"/>
                  <attributes>
                    <attribute name="visible">0</attribute>
                    <attribute name="text">0</attribute>
                    <attribute name="wrap-width">2</attribute>
                  </attributes>
                </child>
              </object>
              <packing>
                <property name="expand">True</property>
                <property name="fill">True</property>
                <property name="position">1</property>
              </packing>
            </child>
          </object>
          <packing>
            <property name="expand">False</property>
            <property name="fill">True</property>
            <property name="position">0</property>
          </packing>
        </child>
        <child>
          <object class="GtkBox" id="box4">
            <property name="visible">True</property>
            <property name="can_focus">False</property>
            <property name="orientation">vertical</property>
            <child>
              <object class="GtkLabel" id="label2">
                <property name="visible">True</property>
                <property name="can_focus">False</property>
                <property name="xpad">76</property>
                <property name="label" translatable="yes">Tipo de cuenta</property>
                <attributes>
                  <attribute name="font-desc" value="&lt;Introducir valor&gt; 10"/>
                  <attribute name="scale" value="1"/>
                </attributes>
              </object>
              <packing>
                <property name="expand">False</property>
                <property name="fill">True</property>
                <property name="position">0</property>
              </packing>
            </child>
            <child>
              <object class="GtkComboBox" id="comboextraer1">
                <property name="visible">True</property>
                <property name="can_focus">False</property>
                <property name="halign">center</property>
                <property name="valign">center</property>
                <property name="model">tipo_cuenta</property>
                <property name="wrap_width">3</property>
                <property name="row_span_column">3</property>
                <property name="column_span_column">3</property>
                <property name="active">0</property>
                <property name="button_sensitivity">on</property>
                <property name="id_column">0</property>
                <property name="active_id">extraer</property>
                <child>
                  <object class="GtkCellRendererText" id="lista_extraer1"/>
                  <attributes>
                    <attribute name="visible">0</attribute>
                    <attribute name="text">0</attribute>
                    <attribute name="wrap-width">2</attribute>
                  </attributes>
                </child>
              </object>
              <packing>
                <property name="expand">True</property>
                <property name="fill">True</property>
                <property name="position">1</property>
              </packing>
            </child>
          </object>
          <packing>
            <property name="expand">False</property>
            <property name="fill">True</property>
            <property name="position">1</property>
          </packing>
        </child>
      </object>
      <packing>
        <property name="expand">True</property>
        <property name="fill">False</property>
        <property name="position">0</property>
      </packing>
    </child>
    <child>
      <object class="GtkBox" id="box5">
        <property name="visible">True</property>
        <property name="can_focus">False</property>
        <child>
          <object class="GtkButton" id="boton">
            <property name="label" translatable="yes">Sacar dinero</property>
            <property name="visible">True</property>
            <property name="can_focus">True</property>
            <property name="receives_default">True</property>
            <property name="margin_left">3</property>
            <property name="margin_right">6</property>
            <property name="margin_top">9</property>
            <property name="margin_bottom">6</property>
            <property name="relief">half</property>
            <property name="image_position">bottom</property>
          </object>
          <packing>
            <property name="expand">False</property>
            <property name="fill">True</property>
            <property name="position">0</property>
          </packing>
        </child>
        <child>
          <object class="GtkLabel" id="verificar">
            <property name="visible">True</property>
            <property name="can_focus">False</property>
            <property name="margin_left">33</property>
            <property name="margin_right">40</property>
            <property name="label" translatable="yes">Verificar</property>
            <attributes>
              <attribute name="scale" value="1"/>
            </attributes>
          </object>
          <packing>
            <property name="expand">False</property>
            <property name="fill">True</property>
            <property name="position">1</property>
          </packing>
        </child>
        <child>
          <object class="GtkLabel" id="Deposito">
            <property name="visible">True</property>
            <property name="can_focus">False</property>
            <property name="margin_left">74</property>
            <property name="margin_right">64</property>
            <property name="label" translatable="yes">Deposito</property>
          </object>
          <packing>
            <property name="expand">False</property>
            <property name="fill">True</property>
            <property name="position">2</property>
          </packing>
        </child>
      </object>
      <packing>
        <property name="expand">False</property>
        <property name="fill">True</property>
        <property name="position">1</property>
      </packing>
    </child>
  </object>
</child>
</object>

And I did this code in Vala language:

using Gtk;

class Cajero : GLib.Object {

public Cajero(){
    int deposito = 3000;
    var builder = new Builder();
    builder.add_from_file("cajero.ui");
    builder.connect_signals(null);
    var ventana = builder.get_object("window1") as Window;
    ventana.title = "Cajero Automático";
    ventana.destroy.connect(Gtk.main_quit);
    var contenedor = builder.get_object("box1") as Box;
    var caja1 = builder.get_object("box2") as Box;
    var caja2 = builder.get_object("box3") as Box;
    var label1 = builder.get_object("label1") as Label;
    var combo_extraer = builder.get_object("comboextraer") as ComboBox;
    var lista_extraer = builder.get_object("lista_extraer") as CellRendererText;
    var caja3 = builder.get_object("box4") as Box;
    var label2 = builder.get_object("label2") as Label;
    var combo_cuenta = builder.get_object("comboextraer1") as ComboBox;
    var lista_cuenta = builder.get_object("lista_extraer1") as CellRendererText;
    var caja4 = builder.get_object("box5") as Box;
    var boton = builder.get_object("boton") as Button;
    var label3 = builder.get_object("verificar") as Label;
    var label4 = builder.get_object("Deposito") as Label;
    boton.clicked.connect(() => {
        int extraer = combo_extraer.get_active();
        int cuenta = combo_cuenta.get_active();
        if(cuenta == 1){
            if(extraer > 200){
                label3.set_label("Incorrecto");
            }else{
                label3.set_label("Correcto");
                deposito = deposito - extraer;
                if(deposito < 0){
                    ventana.title = "Fuera de servicio";
                    deposito = deposito + extraer;
                    label4.set_label(deposito.to_string());
                }else{
                    label4.set_label(deposito.to_string());
                }
            }
        }else{
            if(extraer > 400){
                label3.set_label("Incorrecto");
            }else{
                label3.set_label("Correcto");
                deposito = deposito - extraer;
                if(deposito < 0){
                    ventana.title = "Fuera de servicio";
                    deposito = deposito + extraer;
                    label4.set_label(deposito.to_string());
                }else{
                    label4.set_label(deposito.to_string());
                }
            }
        }
    });
    ventana.show_all(); 
}

public static int main(string[] args) {
    Gtk.init(ref args);
    Cajero cajero = new Cajero();
    Gtk.main();
    return 0;
}
}

I don't know how I can get the element value of combo_extraer. I get the active element position only with this Vala code but I can't get its value.

Was it helpful?

Solution

You have to get the value from the ListStore that is used by the CombobBox.

Basically you call get_active_iter on the ComboBox to get an iterator to the active entry and then you call get_value with that iterator and the column you want to retrieve from the list store.

Your list store is called dinero, you have to get it from the builder, as you already do for the other components.

The example in valadoc shows how it is done in general:

public class Application : Gtk.Window {
    public Application () {
        // Prepare Gtk.Window:
        this.title = "My Gtk.ComboBox";
        this.window_position = Gtk.WindowPosition.CENTER;
        this.destroy.connect (Gtk.main_quit);

        // Create & fill a ListStore:
        Gtk.ListStore list_store = new Gtk.ListStore (2, typeof (string), typeof (int));
        Gtk.TreeIter iter;

        list_store.append (out iter);
        list_store.set (iter, 0, "Burgenland", 1, 13);
        list_store.append (out iter);
        list_store.set (iter, 0, "Carinthia", 1, 17);

        // The Box:
        Gtk.ComboBox box = new Gtk.ComboBox.with_model (list_store);
        this.add (box);

        Gtk.CellRendererText renderer = new Gtk.CellRendererText ();
        box.pack_start (renderer, true);
        box.add_attribute (renderer, "text", 0);
        box.active = 0;

        renderer = new Gtk.CellRendererText ();
        box.pack_start (renderer, true);
        box.add_attribute (renderer, "text", 1);
        box.active = 0;

        box.changed.connect (() => {
            Value val1;
            Value val2;

            box.get_active_iter (out iter);
            list_store.get_value (iter, 0, out val1);
            list_store.get_value (iter, 1, out val2);

            stdout.printf ("Selection: %s, %d\n", (string) val1, (int) val2);
        });
    }

    public static int main (string[] args) {
        Gtk.init (ref args);

        Application app = new Application ();
        app.show_all ();
        Gtk.main ();
        return 0;
    }
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top