Pygtk-treeview-class

提供:Dev Guides
移動先:案内検索

PyGTK-TreeViewクラス

Treeviewウィジェットは、gtk.TreeModelインターフェイスを実装するモデルのコンテンツを表示します。 PyGTKは次のタイプのモデルを提供します-

  • gtk.ListStore
  • gtk.TreeStore
  • gtk.TreeModelSort

ListStoreはリストモデルです。 gtk.TreeViewウィジェットに関連付けられている場合、選択元のアイテムを含むリストボックスを生成します。 gtk.ListStoreオブジェクトは、次の構文で宣言されています-

store = gtk.ListStore(column_type)

リストには複数の列がある場合があり、事前定義された型定数は-

  • gobject.TYPE_BOOLEAN
  • gobject.TYPE_BOXED
  • gobject.TYPE_CHAR
  • gobject.TYPE_DOUBLE
  • gobject.TYPE_ENUM
  • gobject.TYPE_FLOAT
  • gobject.TYPE_INT
  • gobject.TYPE_LONG
  • gobject.TYPE_NONE
  • gobject.TYPE_OBJECT
  • gobject.TYPE_STRING
  • gobject.TYPE_UCHAR
  • gobject.TYPE_UINT
  • gobject.TYPE_ULONG
  • gtk.gdk.pixbufなど

たとえば、文字列項目を格納するListStoreオブジェクトは次のように宣言されます-

store = gtk.ListStore(gobject.TYPE_STRING

ストアにアイテムを追加するには、append()メソッドを使用します-

store.append (["item 1"])

TreeStoreは、複数列のTreeウィジェットのモデルです。 たとえば、次のステートメントは、文字列項目を持つ1つの列を持つストアを作成します。

Store = gtk.TreeStore(gobject.TYPE_STRING)

TreeStoreにアイテムを追加するには、append()メソッドを使用します。 append()メソッドには、親と行の2つのパラメーターがあります。 トップレベルのアイテムを追加するには、親はNoneです。

row1 = store.append(None, ['row1'])

複数の行を追加するには、このステートメントを繰り返す必要があります。

子行を追加するには、親パラメーターとしてトップレベル行をappend()メソッドに渡します-

childrow = store.append(row1, ['child1'])

複数の子行を追加するには、このステートメントを繰り返す必要があります。

次に、TreeViewウィジェットを作成し、上記のTreeStoreオブジェクトをモデルとして使用します。

treeview = gtk.TreeView(store)

次に、ストアデータを表示するためにTreeViewColumnを作成する必要があります。 gtk.TreeViewColumnのオブジェクトは、gtk.CelRendererを使用してヘッダーとセルを管理します。 TreeViewColumnオブジェクトは、次のコンストラクタを使用して作成されます-

gtk.TreeViewColumn(title, cell_renderer,…)

タイトルとレンダラーに加えて、属性の値を取得するツリーモデル列を指定するために、0個以上のattribute = columnペアが必要です。 これらのパラメータは、以下に示すTreeViewColumnクラスのメソッドを使用して設定することもできます。

gtk.CellRendererは、さまざまなタイプのデータをレンダリングするための一連のオブジェクトの基本クラスです。 派生クラスは、CellRendererText、CellRendererPixBuf、およびCellRendererToggleです。

TreeViewColumnクラスの次のメソッドは、そのオブジェクトを構成するために使用されます-

  • TreeViewColumn.pack_start(cell、expand = True)-このメソッドは、CellRendererオブジェクトを開始列にパックします。 expandパラメータがTrueに設定されている場合、割り当てられたスペース全体がセルに割り当てられます。 TreeViewColumn.add_attribute(cell、attribute、column)-このメソッドは、属性マッピングをツリー列のリストに追加します。 column *はツリーモデルの列です。
  • TreeViewColumn.set_attributes()−このメソッドは、 attribute = column のペアを使用して*レンダラー*の属性の場所を設定します TreeViewColumn.set_visible()− Trueの場合、*ツリービュー列が表示されます
  • TreeViewColumn.set_title()-このメソッドは、「title」プロパティを指定された値に設定します。
  • TreeViewColumn.set_lickable()-Trueに設定されている場合、ヘッダーはキーボードフォーカスを取得してクリックできます。
  • TreeViewColumn.set_alignment(xalign)-このメソッドは、「alignment」プロパティを xalign の値に設定します。

ユーザーが_treeviewcolumn_ヘッダーボタンをクリックすると、「クリックされた」シグナルが発行されます。

TreeViewColumnオブジェクトを構成すると、append_column()メソッドを使用してTreeViewウィジェットに追加されます。

以下は、TreeViewクラスの重要なメソッドです-

 *TreevVew.set_model()-これは、ツリービューの「モデル」プロパティを設定します。 ツリービューにモデルセットが既にある場合、このメソッドは新しいモデルを設定する前にそれを削除します。* model *が *None* の場合、古いモデルは設定解除されます。
* TreeView.set_header_clickable()-Trueに設定されている場合、列タイトルボタンをクリックできます。
* TreeView.append_column()-これは、指定された *TreeViewColumn* を列のリストに追加します。
* TreeView.remove_column()-これは、指定された列をツリービューから削除します。
* TreeView.insert_column()-これは、指定された *column* をツリービューの *position* で指定された場所に挿入します。

TreeViewウィジェットは、次の信号を発します-

cursor-changed This is emitted when the cursor moves or is set.
expand-collapse-cursor-row This is emitted when the row at the cursor needs to be expanded or collapsed.
row-activated This is emitted when the user double clicks a treeview row
row-collapsed This is emitted when a row is collapsed by the user or programmatic action.
row-expanded This is emitted when a row is expanded via the user or programmatic action.

TreeViewウィジェットの2つの例を以下に示します。 最初の例では、ListStoreを使用して単純なListViewを作成します。

ここで、ListStoreオブジェクトが作成され、文字列項目が追加されます。 このListStoreオブジェクトは、TreeViewオブジェクトのモデルとして使用されます-

store = gtk.ListStore(str)

treeView = gtk.TreeView()
treeView.set_model(store)

次に、CellRendererTextがTreeViewColumnオブジェクトに追加され、同じものがTreeViewに追加されます。

rendererText = gtk.CellRendererText()
column = gtk.TreeViewColumn("Name", rendererText, text = 0)
treeView.append_column(column)

TreeViewオブジェクトは、固定コンテナに追加することにより、トップレベルウィンドウに配置されます。

例1

次のコードを観察してください-

import pygtk
pygtk.require('2.0')
import gtk

class PyApp(gtk.Window):
   def __init__(self):
      super(PyApp, self).__init__()
      self.set_title("TreeView with ListStore")
      self.set_default_size(250, 200)
      self.set_position(gtk.WIN_POS_CENTER)

      store = gtk.ListStore(str)
      store.append (["PyQt"])
      store.append (["Tkinter"])
      store.append (["WxPython"])
      store.append (["PyGTK"])
      store.append (["PySide"])

      treeView = gtk.TreeView()
      treeView.set_model(store)

      rendererText = gtk.CellRendererText()
      column = gtk.TreeViewColumn("Python GUI Libraries", rendererText, text=0)
      treeView.append_column(column)

      fixed = gtk.Fixed()
      lbl = gtk.Label("select a GUI toolkit")
      fixed.put(lbl, 25,75)
      fixed.put(treeView, 125,15)

      lbl2 = gtk.Label("Your choice is:")
      fixed.put(lbl2, 25,175)
      self.label = gtk.Label("")

      fixed.put(self.label, 125,175)
      self.add(fixed)

      treeView.connect("row-activated", self.on_activated)
      self.connect("destroy", gtk.main_quit)
      self.show_all()

   def on_activated(self, widget, row, col):

      model = widget.get_model()
      text = model[row][0]
      self.label.set_text(text)

def main():
   gtk.main()
   return

if __name__ == "__main__":
   bcb = PyApp()
   main()

ユーザーが選択したアイテムは、* on_activatedコールバック*関数が呼び出されると、ウィンドウのラベルに表示されます。

ListStoreのあるTreeView

例2

2番目の例は、TreeStoreから階層的なTreeViewを構築します。 このプログラムは、ストアを構築し、それをTreeViewのモデルとして設定し、TreeViewColumnを設計し、それをTreeViewに追加するという同じシーケンスに従います。

import gtk

class PyApp(gtk.Window):

   def __init__(self):
      super(PyApp, self).__init__()

      self.set_title("TreeView with TreeStore")
      self.set_size_request(400,200)
      self.set_position(gtk.WIN_POS_CENTER)
      vbox = gtk.VBox(False, 5)

      # create a TreeStore with one string column to use as the model
      store = gtk.TreeStore(str)

      # add row
      row1 = store.append(None, ['JAVA'])

      #add child rows
      store.append(row1,['AWT'])
      store.append(row1,['Swing'])
      store.append(row1,['JSF'])

      # add another row
      row2 = store.append(None, ['Python'])
      store.append(row2,['PyQt'])
      store.append(row2,['WxPython'])
      store.append(row2,['PyGTK'])

      # create the TreeView using treestore
      treeview = gtk.TreeView(store)
      tvcolumn = gtk.TreeViewColumn('GUI Toolkits')
      treeview.append_column(tvcolumn)

      cell = gtk.CellRendererText()
      tvcolumn.pack_start(cell, True)
      tvcolumn.add_attribute(cell, 'text', 0)
      vbox.add(treeview)

      self.add(vbox)

      self.connect("destroy", gtk.main_quit)
      self.show_all()

PyApp()
gtk.main()

次のツリービューが出力として表示されます-

TreeViewのあるTreeView