2011年5月29日日曜日

せっかくなので、TreeViewにアイテムを追加出来るようにしてみる。

今回は、前回Gladeで作成したTreeViewを使ったリスト表示の画面に、プログラムからアイテムを追加する、というネタをやります。

っても、ネタってほどのモノじゃないんですが、実はこれが。(笑)
激、シンプル。

追加したコードは以下の内容になりますかね。
    def on_btAdd_clicked(self,widget):
        tbEdit = self.wTree.get_object("tbEdit")
        self.listStore.append([len(self.listStore)+1,tbEdit.get_text()])
前回はpassで済ませてた、追加ボタンを押された場合の処理を追記しただけです。
GTKのTreeViewのこのListStoreというオブジェクトを使う場合、Pythonでは、アイテムの追加には、appendというメソッドを使い、渡すのは、その行の列の形式にマッチしたタプル(またはリスト)を渡します。
今回はリストで渡してますけど。

簡単にプログラムを説明してしまうと、最初に、入力文字列を取得するために、GTKBuilderから、テキストボックスのオブジェクトを取得し、次に、現在のListStoreのアイテム数(行数)をlen()関数で取得して、その値に1を加えたものを行番号とし、それにテキストボックスに入力された文字列を取得して、リストを作成し、appendの引数に与えてるだけです。

これ、結構考えられるなー、と思ったのが、タプルで渡すとこ、ですかね。
つまり、forで受け取ったタプルを、そのままappend出来るわけです。
どんな時に便利か、というと、データベースからデータ取得してきた際に、タプルで戻されるようにしておけば、forを使って、TreeViewに簡単に表を作れてしまう、ってところでしょうか。

この辺、SQLiteと組み合わせたサンプルというか、課題っぽいものを考えてますので、またいずれ。(笑)
まあ、焦っても、気になるあの子のブラチラは拝めません。
やはり、夏になって、薄着になり、かつ胸元が大きく開いた服を着た日を狙わないと、なかなか拝めないものです。
つまり、下準備が重要ということですな。(何の

今年の夏は冷房も制限されるようで、なおさら、薄着で胸元の大きく開いた服が期待できます。
ある意味、震災もラッキーだったかも、と前向きに考えて、気になるあの子の胸の谷間やブラチラをゲットしましょう。(笑)

ま、与太はともかく。
一応、ソースコード全文を掲載しときます。
Gladeファイルは前回のモノと変わってないので、そのまま使ってください。
import sys
import os.path
try:
    import pygtk
    pygtk.require("2.0")
except:
    pass
try:
    import gtk
except:
    sys.exit(1)
__author__ = 'kaoru'

class sample2:

    def __init__(self):
        gladefile = 'sample2.glade'
        self.wTree = gtk.Builder()
        self.wTree.add_from_file(os.path.dirname(os.path.abspath(__file__)) + "/"+gladefile)
        self.wTree.connect_signals(self)
        self.treeView = self.wTree.get_object("treeview1")
        self.listStore = self.wTree.get_object("liststore1")
        self.MainWindow = self.wTree.get_object("MainWindow")
        self.MainWindow.show_all()

    def on_MainWindow_destroy(self,widget):
        gtk.main_quit()

    def on_btAdd_clicked(self,widget):
        tbEdit = self.wTree.get_object("tbEdit")
        self.listStore.append([len(self.listStore)+1,tbEdit.get_text()])

    def on_btOK_clicked(self,widget):
        gtk.main_quit()

    def on_btClose_clicked(self,widget):
        gtk.main_quit()


if __name__ == "__main__":
    sample2()
    gtk.main()

2011年5月22日日曜日

GladeのGTKBuilderでTreeViewを作る。




いや、これ、作れるのは解ってたんですが、細かいところまで、実は解ってなかったんで、覚書ついでに書いときます。
Gladeを使って、TreeViewを表として作成する場合なんですが、従来は、かなりの部分までプログラムで作りこまないとならなかったんですが、GTKBuilder対応になってからは、ほぼGladeで作成出来るようになってました。


今まで知らなかったとか、何事、みたいな。(笑)


非常にシンプルなサンプルですが、Gladeで、TreeViewを配置します。
枠で囲った部分がTreeViewです。

この時、TreeViewで指定するモデルも同時に新規に作成するんですが、リストモデルで作成することになります。

枠で囲ったところで指定するんですが、最初は何もないので、新規に作成することになります。

「…」ボタンを押すとウィンドウが表示されるので、そこで、新規にリストモデルを作成します。
こんなウィンドウが出ますね。





ここで新規ボタンを押すと、モデルが作成出来ます。
今回は表を作りたいので、リストモデルを作成することになります。

  
ここまでは、今までも知ってました。(笑)
ここからが実は問題だったんです。

ここで、TreeViewを右クリックすると、Editメニューがあります。
これに気づいてなかったんですね。(爆)
このエディットを選択するとTreeViewの細々した設定や、列の追加、予め表示して置きたいデータなどが設定出来ます。


こんな感じに細かい設定が出来るんです。
んで、これを元に作ったサンプルプログラムがこれです。
import sys
import os.path
try:
    import pygtk
    pygtk.require("2.0")
except:
    pass
try:
    import gtk
except:
    sys.exit(1)
__author__ = 'kaoru'

class sample2:

    def __init__(self):
        gladefile = 'sample2.glade'
        self.wTree = gtk.Builder()
        self.wTree.add_from_file(os.path.dirname(os.path.abspath(__file__)) + "/"+gladefile)
        self.wTree.connect_signals(self)
        self.treeView = self.wTree.get_object("treeview1")
        self.listStore = self.wTree.get_object("liststore1")
        self.MainWindow = self.wTree.get_object("MainWindow")
        self.MainWindow.show_all()

    def on_MainWindow_destroy(self,widget):
        gtk.main_quit()

    def on_btAdd_clicked(self,widget):
        pass

    def on_btOK_clicked(self,widget):
        gtk.main_quit()

    def on_btClose_clicked(self,widget):
        gtk.main_quit()


if __name__ == "__main__":
    sample2()
    gtk.main()
こんだけで、こういう風にリスト表示が可能になります。


超シンプル。(笑)
これで、あとは、liststoreに対して、データをどんどん追加して上げれば表の完成ですし、選択するCellRendarerによっては、編集可能な表も作成することが出来ます。
もちろん、セルを編集するとイベントが発生するのでイベントをハンドルしてデータを書き込むとかDBを更新するなんて処理も、結構簡単に書けてしまいます。

いやぁ、今までこんな使い方を知らずに、TreeViewで苦労してたとか、非常にバカみたいでした。(笑)

これで、これからはTreeViewも全然怖くありません。
ガンガン活用していこうと思います。(笑)