# 간단한 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

columns = ["First Name", "Last Name", "Phone Number"]

phonebook = [["Jurg", "Billeter", "555-0123"], ["Johannes", "Schmid", "555-1234"], ["Julita", "Inca", "555-2345"], ["Javier", "Jardon", "555-3456"], ["Jason", "Clinton", "555-4567"], ["Random J.", "Hacker", "555-5678"]]

class MyWindow(Gtk.ApplicationWindow):

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

# the data in the model (three strings for each row, one for each # column) listmodel = Gtk.ListStore(str, str, str) # append the values in the model for i in range(len(phonebook)): listmodel.append(phonebook[i])

# a treeview to see the data stored in the model view = Gtk.TreeView(model=listmodel) # for each column for i, column in enumerate(columns): # cellrenderer to render the text cell = Gtk.CellRendererText() # the text in the first column should be in boldface if i == 0: cell.props.weight_set = True cell.props.weight = Pango.Weight.BOLD # the column is created col = Gtk.TreeViewColumn(column, cell, text=i) # and it is appended to the treeview view.append_column(col)

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

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

# a grid to attach the widgets grid = Gtk.Grid() grid.attach(view, 0, 0, 1, 1) grid.attach(self.label, 0, 1, 1, 1)

# attach 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 self.label.set_text("\n %s %s %s" % (model[iter][0], model[iter][1], model[iter][2])) return True

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에 대한 쓸만한 메서드 목록을 보시려면 를 참고하십시오.

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

# API 참고서

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

GtkTreeView

GtkTreeModel

GtkListStore

GtkCellRendererText

GtkTreeViewColumn

pygobject - Python bindings for GObject Introspection

Fonts