昨日のコードを .gjotsfile を読み込むように改造してみた。
Gjots2 が保存するファイルは
“\NewEntry” でエントリーの追加
“\NewFolder” で入れ子の作成
“\EndFolder” で入れ子を一階層戻る
ツリータイトルはエントリーの一行め
だけという恐ろしく単純明解な構造である。
ルールもタイトルの一文字めには \ を使わないということだけ。
これなら初心者でも自力で読み書きするコードが書けそうです。
Python でファイルを一行毎に処理する方法は
path = os.path.expanduser("~/.gjotsfile") f = open(path) x = f.read() f.close() lines = x.split("\n") for line in lines: hoge
という一番単純な方法と
path = os.path.expanduser("~/.gjotsfile") f = open(path) try: for line in f: hoge finally: f.close()
の方法がある、下の方法のほうが圧倒的に早い。
一度全部読み込んで展開するのかストリームで読むかの差である。
但し行末に改行コードが含まれている、それと try 文にしないと何かあった場合に close できないというオチがあるので注意して使いましょう。
とりあえず上記フラグがあった場合に分岐して if 文を作成。
現在は空状態を示す方法として “\NonTitle” みたいなフラグを追加。
“\NewEntry” で GtkTreeStore にアペンドして読み込んだ部分を空にする。
イテレータを “\NewFolder” で入れ替え “\EndFolder” で書き戻し。
そんな感じにして上手くいったコード。
#!/usr/bin/env python #-*- coding:utf-8 -*- import os from gi.repository import Gtk, Gio, GtkSource class TreeWin(Gtk.Window): """ GtkTreeView Sample """ def __init__(self): Gtk.Window.__init__(self) # CellRenderer cell = Gtk.CellRendererText() column = Gtk.TreeViewColumn("Tree Title", cell) column.add_attribute(cell, "text", 0) # TreeView and TreeStore store = Gtk.TreeStore.new([str, str]) tree = Gtk.TreeView.new_with_model(store) tree.append_column(column) # Hide Header tree.props.headers_visible = False # Signal selection = tree.get_selection() selection.connect("changed", self.selection_changeed) # # Data self.path = os.path.expanduser("~/.gjotsfile") t = ".gjotsfile" s = "" it = None itold = None f = open(self.path) try: for line in f: if line == "\\NewEntry\n": if t == ".gjotsfile": it = store.append(it, [t, s]) elif t != "\\NoneTitle": store.append(it, [t, s]) s = "" t = "\\NoneTitle" elif line == "\\NewFolder\n": itold = it.copy() it = store.append(it, [t, s]) s = "" t = "\\NoneTitle" elif line == "\\EndFolder\n": store.append(it, [t, s]) it = itold s = "" t = "\\NoneTitle" else: if t == "\\NoneTitle": t = line[:-1] s += "{0}".format(line) finally: f.close() # # GtkSourceView self.view = GtkSource.View() self.view.set_show_line_numbers(True) # Paned and ScrolledWindow swa = Gtk.ScrolledWindow() swa.add(tree) swb = Gtk.ScrolledWindow() swb.add(self.view) hp = Gtk.HPaned() hp.add1(swa) hp.add2(swb) # self self.set_title("TreeView Test") self.add(hp) self.show_all() def selection_changeed(self, widget, data=None): """ Params @ widget: GtkTreeSelection """ model, it = widget.get_selected() if it: buf = self.view.get_buffer() buf.set_text(model.get_value(it, 1)) class App(Gtk.Application): def __init__(self): Gtk.Application.__init__( self, application_id="apps.test.treeview", flags=Gio.ApplicationFlags.FLAGS_NONE) self.connect("activate", self.on_activate) def on_activate(self, data=None): w = TreeWin() w.set_application(self) if __name__ == "__main__": app = App() app.run(None)
もう少しスマートにできそうなんだけど…
そういえば Ubuntu でも動くかな、仮想マシンの 11.10 で実験。
よし動く、後は書き込みとツリーの追加削除移動なんかだ。
とりあえず今日はココまで、ノンビリすぎだと思うけど。