2

コンボボックスを小さな GTK3 インターフェイスに適用しようとしていますが、そのリストを作成する方法と、インターフェイスのコンボボックスを Python コードに接続する方法がわかりません。

誰かがちょっとした例でその方法を教えてもらえますか? 残りは私が終わらせることができます。

4

1 に答える 1

6

TextViews や TreeViews のような ComboBoxes は、モデル (保持する情報) からビュー (どのように見えるか) を明確に分離するウィジェットです。Glade で行う必要があるのは、次のとおりです。

  1. GUI のどこかに Combobox を追加します。
  2. データを保持する ListStore を作成します。必要な列に合わせて Liststore を構成します (各列には型があります)。
  3. コンボボックスに戻り、前に作成した Liststore をモデルとして設定します。
  4. コンボボックスを編集 (右クリック、編集) し、セル レンダラーを追加します。そのセル レンダラーをマップして、モデルの一部の列からのデータを表示します。
  5. データが静的な場合、Glade 内で ListStore に行を追加できます。データが動的である場合は、コードでリストストアを取得し、リストストアと同じタイプの要素を持つリストを入力する必要があります。

私が考えることができる小さな例はこれです:

テストグレード

<?xml version="1.0" encoding="UTF-8"?>
<interface>
  <!-- interface-requires gtk+ 3.0 -->
  <object class="GtkListStore" id="myliststore">
    <columns>
      <!-- column-name code -->
      <column type="gchararray"/>
      <!-- column-name legible -->
      <column type="gchararray"/>
    </columns>
  </object>
  <object class="GtkWindow" id="window">
    <property name="can_focus">False</property>
    <property name="window_position">center-always</property>
    <property name="default_width">400</property>
    <signal name="destroy" handler="main_quit" swapped="no"/>
    <child>
      <object class="GtkBox" id="box">
        <property name="visible">True</property>
        <property name="can_focus">False</property>
        <child>
          <object class="GtkLabel" id="label">
            <property name="visible">True</property>
            <property name="can_focus">False</property>
            <property name="label" translatable="yes">Best color in the world:</property>
          </object>
          <packing>
            <property name="expand">True</property>
            <property name="fill">True</property>
            <property name="position">0</property>
          </packing>
        </child>
        <child>
          <object class="GtkComboBox" id="mycombobox">
            <property name="visible">True</property>
            <property name="can_focus">False</property>
            <property name="model">myliststore</property>
            <signal name="changed" handler="combobox_changed" swapped="no"/>
            <child>
              <object class="GtkCellRendererText" id="renderer"/>
              <attributes>
                <attribute name="text">1</attribute>
              </attributes>
            </child>
          </object>
          <packing>
            <property name="expand">True</property>
            <property name="fill">True</property>
            <property name="position">1</property>
          </packing>
        </child>
      </object>
    </child>
  </object>
</interface>

test.py

from gi.repository import Gtk
from os.path import abspath, dirname, join

WHERE_AM_I = abspath(dirname(__file__))

class MyApp(object):

    def __init__(self):
        # Build GUI
        self.builder = Gtk.Builder()
        self.glade_file = join(WHERE_AM_I, 'test.glade')
        self.builder.add_from_file(self.glade_file)

        # Get objects
        go = self.builder.get_object
        self.window = go('window')
        self.myliststore = go('myliststore')
        self.mycombobox = go('mycombobox')

        # Initialize interface
        colors = [
            ['#8C1700', 'Redish'],
            ['#008C24', 'Greenish'],
            ['#6B6BEE', 'Blueish'],

        ]
        for c in colors:
            self.myliststore.append(c)
        self.mycombobox.set_active(0)

        # Connect signals
        self.builder.connect_signals(self)

        # Everything is ready
        self.window.show()

    def main_quit(self, widget):
        Gtk.main_quit()

    def combobox_changed(self, widget, data=None):
        model = widget.get_model()
        active = widget.get_active()
        if active >= 0:
            code = model[active][0]
            print('The code of the selected color is {}'.format(code))
        else:
            print('No color selected')

if __name__ == '__main__':
    try:
        gui = MyApp()
        Gtk.main()
    except KeyboardInterrupt:
        pass

敬具

于 2012-05-10T04:10:15.860 に答える