# 간단한 TreeView와 ListStore(Python)

Marta Maria Casetti
mmcasetti@gmail.com 2012
ListStore를 표시하는 TreeView(더 복잡한 예제)
조성호
shcho@gnome.org 2017-2019.

# 좀 더 복잡한 TreeView와 ListStore

이 TreeView에서는 선택 "changed" 시그널을 연결한 간단한 ListStore를 보여줍니다.

# 예제 결과를 만드는 코드

from gi.repository import Gtk from gi.repository import Pango import sys

list_of_dvd = [["The Usual Suspects"], ["Gilda"], ["The Godfather"], ["Pulp Fiction"], ["Once Upon a Time in the West"], ["Rear Window"]]

class MyWindow(Gtk.ApplicationWindow):

def __init__(self, app): Gtk.Window.__init__(self, title="My DVDs", application=app) self.set_default_size(250, 100) self.set_border_width(10)

# the data are stored in the model # create a liststore with one column self.listmodel = Gtk.ListStore(str) for i in range(len(list_of_dvd)): self.listmodel.append(list_of_dvd[i])

# a treeview to see the data stored in the model view = Gtk.TreeView(model=self.listmodel)

# cellrenderer for the first column cell = Gtk.CellRendererText() # the first column is created col = Gtk.TreeViewColumn("Title", cell, text=0) # and it is appended to the treeview view.append_column(col)

# when a row of the treeview is selected, it emits a signal self.selection = view.get_selection() self.selection.connect("changed", self.on_changed)

# the label we use to show the selection self.label = Gtk.Label() self.label.set_text("")

# a button to add new titles, connected to a callback function self.button_add = Gtk.Button(label="Add") self.button_add.connect("clicked", self.add_cb)

# an entry to enter titles self.entry = Gtk.Entry()

# a button to remove titles, connected to a callback function self.button_remove = Gtk.Button(label="Remove") self.button_remove.connect("clicked", self.remove_cb)

# a button to remove all titles, connected to a callback function self.button_remove_all = Gtk.Button(label="Remove All") self.button_remove_all.connect("clicked", self.remove_all_cb)

# a grid to attach the widgets grid = Gtk.Grid() grid.attach(view, 0, 0, 4, 1) grid.attach(self.label, 0, 1, 4, 1) grid.attach(self.button_add, 0, 2, 1, 1) grid.attach_next_to( self.entry, self.button_add, Gtk.PositionType.RIGHT, 1, 1) grid.attach_next_to( self.button_remove, self.entry, Gtk.PositionType.RIGHT, 1, 1) grid.attach_next_to( self.button_remove_all, self.button_remove, Gtk.PositionType.RIGHT, 1, 1)

# add the grid to the window self.add(grid)

def on_changed(self, selection): # get the model and the iterator that points at the data in the model (model, iter) = selection.get_selected() # set the label to a new value depending on the selection, if there is # one if iter is not None: self.label.set_text("\n %s" % (model[iter][0])) else: self.label.set_text("") return True

# callback function for the "Add" button def add_cb(self, button): # append to the model the title that is in the entry title = self.entry.get_text() self.listmodel.append([title]) # and print a message in the terminal print("%s has been added" % (title))

def remove_cb(self, button): # if there is still an entry in the model if len(self.listmodel) != 0: # get the selection (model, iter) = self.selection.get_selected() # if there is a selection, print a message in the terminal # and remove it from the model if iter is not None: print("%s has been removed" % (model[iter][0])) self.listmodel.remove(iter) # otherwise, ask the user to select something to remove else: print("Select a title to remove") # else, if there are no entries in the model, print "Empty list" # in the terminal else: print("Empty list")

def remove_all_cb(self, button): # if there is still an entry in the model if len(self.listmodel) != 0: # remove all the entries in the model for i in range(len(self.listmodel)): iter = self.listmodel.get_iter(0) self.listmodel.remove(iter) # print a message in the terminal alerting that the model is empty print("Empty list")

class MyApplication(Gtk.Application):

def __init__(self): Gtk.Application.__init__(self)

def do_activate(self): win = MyWindow(self) win.show_all()

def do_startup(self): Gtk.Application.do_startup(self)

app = MyApplication() exit_status = app.run(sys.argv) sys.exit(exit_status)

# TreeView 위젯에 쓸만한 메서드

TreeView 위젯은 Model/View/Controller 방식으로 설계했습니다. Model은 데이터를, View는 바뀐 내용 알림을 받은 후의 모델의 내용을, 마지막으로 Controller는 모델의 상태를 바꾸고 뷰에게 바뀐 모델의 상태를 알리는 코드를 담습니다. 자세한 내용과 TreeModel에 대한 쓸만한 메서드 목록을 보시려면 를 참고하십시오.

36번째 줄에서 `"changed"` 시그널은 `widget.connect(signal, callback function)` 함수로 `on_changed()` 콜백 함수에 연결했습니다. 더 자세한 설명은 를 참조하십시오.

# API 참고서

이 예제는 다음 참고자료가 필요합니다:

GtkTreeView

GtkTreeModel

GtkListStore

GtkCellRendererText

GtkTreeViewColumn

pygobject - Python bindings for GObject Introspection