Blame platform-demos/ko/treeview_advanced_liststore.py.page

Packit 1470ea
Packit 1470ea
<page xmlns="http://projectmallard.org/1.0/" xmlns:its="http://www.w3.org/2005/11/its" xmlns:xi="http://www.w3.org/2001/XInclude" type="guide" style="task" id="treeview_advanced_liststore.py" xml:lang="ko">
Packit 1470ea
  <info>
Packit 1470ea
    <title type="text">간단한 TreeView와 ListStore(Python)</title>
Packit 1470ea
    <link type="guide" xref="beginner.py#treeview"/>
Packit 1470ea
    <link type="next" xref="treeview_cellrenderertoggle.py"/>
Packit 1470ea
    <revision version="0.1" date="2012-06-30" status="draft"/>
Packit 1470ea
Packit 1470ea
    <credit type="author copyright">
Packit 1470ea
      <name>Marta Maria Casetti</name>
Packit 1470ea
      <email its:translate="no">mmcasetti@gmail.com</email>
Packit 1470ea
      <years>2012</years>
Packit 1470ea
    </credit>
Packit 1470ea
Packit 1470ea
    <desc>ListStore를 표시하는 TreeView(더 복잡한 예제)</desc>
Packit 1470ea
  
Packit 1470ea
    <mal:credit xmlns:mal="http://projectmallard.org/1.0/" type="translator copyright">
Packit 1470ea
      <mal:name>조성호</mal:name>
Packit 1470ea
      <mal:email>shcho@gnome.org</mal:email>
Packit 1470ea
      <mal:years>2017</mal:years>
Packit 1470ea
    </mal:credit>
Packit 1470ea
  </info>
Packit 1470ea
Packit 1470ea
  <title>좀 더 복잡한 TreeView와 ListStore</title>
Packit 1470ea
  <media type="image" mime="image/png" src="media/treeview_advanced_liststore.png"/>
Packit 1470ea
  

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

Packit 1470ea
Packit 1470ea
  <links type="section"/>
Packit 1470ea
Packit 1470ea
  <section id="code">
Packit 1470ea
    <title>예제 결과를 만드는 코드</title>
Packit 1470ea
Packit 1470ea
    from gi.repository import Gtk
Packit 1470ea
from gi.repository import Pango
Packit 1470ea
import sys
Packit 1470ea
Packit 1470ea
list_of_dvd = [["The Usual Suspects"],
Packit 1470ea
               ["Gilda"],
Packit 1470ea
               ["The Godfather"],
Packit 1470ea
               ["Pulp Fiction"],
Packit 1470ea
               ["Once Upon a Time in the West"],
Packit 1470ea
               ["Rear Window"]]
Packit 1470ea
Packit 1470ea
Packit 1470ea
class MyWindow(Gtk.ApplicationWindow):
Packit 1470ea
Packit 1470ea
    def __init__(self, app):
Packit 1470ea
        Gtk.Window.__init__(self, title="My DVDs", application=app)
Packit 1470ea
        self.set_default_size(250, 100)
Packit 1470ea
        self.set_border_width(10)
Packit 1470ea
Packit 1470ea
        # the data are stored in the model
Packit 1470ea
        # create a liststore with one column
Packit 1470ea
        self.listmodel = Gtk.ListStore(str)
Packit 1470ea
        for i in range(len(list_of_dvd)):
Packit 1470ea
            self.listmodel.append(list_of_dvd[i])
Packit 1470ea
Packit 1470ea
        # a treeview to see the data stored in the model
Packit 1470ea
        view = Gtk.TreeView(model=self.listmodel)
Packit 1470ea
Packit 1470ea
        # cellrenderer for the first column
Packit 1470ea
        cell = Gtk.CellRendererText()
Packit 1470ea
        # the first column is created
Packit 1470ea
        col = Gtk.TreeViewColumn("Title", cell, text=0)
Packit 1470ea
        # and it is appended to the treeview
Packit 1470ea
        view.append_column(col)
Packit 1470ea
Packit 1470ea
        # when a row of the treeview is selected, it emits a signal
Packit 1470ea
        self.selection = view.get_selection()
Packit 1470ea
        self.selection.connect("changed", self.on_changed)
Packit 1470ea
Packit 1470ea
        # the label we use to show the selection
Packit 1470ea
        self.label = Gtk.Label()
Packit 1470ea
        self.label.set_text("")
Packit 1470ea
Packit 1470ea
        # a button to add new titles, connected to a callback function
Packit 1470ea
        self.button_add = Gtk.Button(label="Add")
Packit 1470ea
        self.button_add.connect("clicked", self.add_cb)
Packit 1470ea
Packit 1470ea
        # an entry to enter titles
Packit 1470ea
        self.entry = Gtk.Entry()
Packit 1470ea
Packit 1470ea
        # a button to remove titles, connected to a callback function
Packit 1470ea
        self.button_remove = Gtk.Button(label="Remove")
Packit 1470ea
        self.button_remove.connect("clicked", self.remove_cb)
Packit 1470ea
Packit 1470ea
        # a button to remove all titles, connected to a callback function
Packit 1470ea
        self.button_remove_all = Gtk.Button(label="Remove All")
Packit 1470ea
        self.button_remove_all.connect("clicked", self.remove_all_cb)
Packit 1470ea
Packit 1470ea
        # a grid to attach the widgets
Packit 1470ea
        grid = Gtk.Grid()
Packit 1470ea
        grid.attach(view, 0, 0, 4, 1)
Packit 1470ea
        grid.attach(self.label, 0, 1, 4, 1)
Packit 1470ea
        grid.attach(self.button_add, 0, 2, 1, 1)
Packit 1470ea
        grid.attach_next_to(
Packit 1470ea
            self.entry, self.button_add, Gtk.PositionType.RIGHT, 1, 1)
Packit 1470ea
        grid.attach_next_to(
Packit 1470ea
            self.button_remove, self.entry, Gtk.PositionType.RIGHT, 1, 1)
Packit 1470ea
        grid.attach_next_to(
Packit 1470ea
            self.button_remove_all, self.button_remove, Gtk.PositionType.RIGHT, 1, 1)
Packit 1470ea
Packit 1470ea
        # add the grid to the window
Packit 1470ea
        self.add(grid)
Packit 1470ea
Packit 1470ea
    def on_changed(self, selection):
Packit 1470ea
        # get the model and the iterator that points at the data in the model
Packit 1470ea
        (model, iter) = selection.get_selected()
Packit 1470ea
        # set the label to a new value depending on the selection, if there is
Packit 1470ea
        # one
Packit 1470ea
        if iter is not None:
Packit 1470ea
            self.label.set_text("\n %s" % (model[iter][0]))
Packit 1470ea
        else:
Packit 1470ea
            self.label.set_text("")
Packit 1470ea
        return True
Packit 1470ea
Packit 1470ea
    # callback function for the "Add" button
Packit 1470ea
    def add_cb(self, button):
Packit 1470ea
        # append to the model the title that is in the entry
Packit 1470ea
        title = self.entry.get_text()
Packit 1470ea
        self.listmodel.append([title])
Packit 1470ea
        # and print a message in the terminal
Packit 1470ea
        print("%s has been added" % (title))
Packit 1470ea
Packit 1470ea
    def remove_cb(self, button):
Packit 1470ea
        # if there is still an entry in the model
Packit 1470ea
        if len(self.listmodel) != 0:
Packit 1470ea
            # get the selection
Packit 1470ea
            (model, iter) = self.selection.get_selected()
Packit 1470ea
            # if there is a selection, print a message in the terminal
Packit 1470ea
            # and remove it from the model
Packit 1470ea
            if iter is not None:
Packit 1470ea
                print("%s has been removed" % (model[iter][0]))
Packit 1470ea
                self.listmodel.remove(iter)
Packit 1470ea
            # otherwise, ask the user to select something to remove
Packit 1470ea
            else:
Packit 1470ea
                print("Select a title to remove")
Packit 1470ea
        # else, if there are no entries in the model, print "Empty list"
Packit 1470ea
        # in the terminal
Packit 1470ea
        else:
Packit 1470ea
            print("Empty list")
Packit 1470ea
Packit 1470ea
    def remove_all_cb(self, button):
Packit 1470ea
        # if there is still an entry in the model
Packit 1470ea
        if len(self.listmodel) != 0:
Packit 1470ea
            # remove all the entries in the model
Packit 1470ea
            for i in range(len(self.listmodel)):
Packit 1470ea
                iter = self.listmodel.get_iter(0)
Packit 1470ea
                self.listmodel.remove(iter)
Packit 1470ea
        # print a message in the terminal alerting that the model is empty
Packit 1470ea
        print("Empty list")
Packit 1470ea
Packit 1470ea
Packit 1470ea
class MyApplication(Gtk.Application):
Packit 1470ea
Packit 1470ea
    def __init__(self):
Packit 1470ea
        Gtk.Application.__init__(self)
Packit 1470ea
Packit 1470ea
    def do_activate(self):
Packit 1470ea
        win = MyWindow(self)
Packit 1470ea
        win.show_all()
Packit 1470ea
Packit 1470ea
    def do_startup(self):
Packit 1470ea
        Gtk.Application.do_startup(self)
Packit 1470ea
Packit 1470ea
app = MyApplication()
Packit 1470ea
exit_status = app.run(sys.argv)
Packit 1470ea
sys.exit(exit_status)
Packit 1470ea
Packit 1470ea
  </section>
Packit 1470ea
Packit 1470ea
  <section id="methods">
Packit 1470ea
    <title>TreeView 위젯에 쓸만한 메서드</title>
Packit 1470ea
    

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

Packit 1470ea
    

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

Packit 1470ea
  </section>
Packit 1470ea
Packit 1470ea
  <section id="references">
Packit 1470ea
    <title>API 참고서</title>
Packit 1470ea
    

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

Packit 1470ea
    <list>
Packit 1470ea
      <item>

<link href="http://developer.gnome.org/gtk3/unstable/GtkTreeView.html">GtkTreeView</link>

</item>
Packit 1470ea
      <item>

<link href="http://developer.gnome.org/gtk3/unstable/GtkTreeModel.html">GtkTreeModel</link>

</item>
Packit 1470ea
      <item>

<link href="http://developer.gnome.org/gtk3/unstable/GtkListStore.html">GtkListStore</link>

</item>
Packit 1470ea
      <item>

<link href="http://developer.gnome.org/gtk3/unstable/GtkCellRendererText.html">GtkCellRendererText</link>

</item>
Packit 1470ea
      <item>

<link href="http://developer.gnome.org/gtk3/unstable/GtkTreeViewColumn.html">GtkTreeViewColumn</link>

</item>
Packit 1470ea
      <item>

<link href="http://git.gnome.org/browse/pygobject/tree/gi/overrides/Gtk.py">pygobject - GObject 인트로스펙션 파이썬 바인딩</link>

</item>
Packit 1470ea
    </list>
Packit 1470ea
  </section>
Packit 1470ea
</page>