Align left

今日の SeeMe for Linux バックアップ。
はもうヤメにしてトップページにベータとして公開することにした。

しかし Windows 版の About をタブにしたのは失敗だったかな…
なるべく見た目を共通にも GTK+ では GtkAboutDialog を使うのが普通だ。
Windows はこういうのを提供しないのか?知らないだけで有るのだろうか?

それと最初は国際化を狙って日本語部分を strs.py に分けて作っていたんだけど…
面倒だし英語サイトを作る語学力は無いし需要は微妙このうえないし。
Windows 版と表記が違うというのは避けたいのでやはりリテラルで済ませるかと。

それにしてもコードでウィジェット配置は面倒だ。
GtkLabel を GtkTable 内で左寄せするにはどうすればいいのか?

label2 = gtk.Label("標準のサーチエンジン UNIQUEID")
label3 = gtk.Label("Speed Dial サーチエンジン UNIQUEID")
label2.set_alignment(0.0, 0.5)
label3.set_alignment(0.0, 0.5)
table.attach(label2, 0, 1, 0, 1, gtk.FILL)
table.attach(label3, 0, 1, 1, 2, gtk.FILL)

今試したら上記みたくすればイケそう、あまり試していないので問題あるかも。
HTML の table タグは左寄せがデフォルトなのに何故中央配置がデフォルトなんだろう?

それとラヂオボタングループをインデントさせたいのだがどうすれば?
GtkBox の set_spacing では上下左右全部の指定しかできないんだよね。
mono で作った時は GtkHBox を挟んで左側に空文字を置くというアホな方法を使ったけど。
左だけにマージンを指定するにはやはりそういう方法しか無いのかな?意外と難しい。

GtkTreeView in Get front Iterator

今日の SeeMe for Linux バックアップ。
バックアップ機能とか細かいものはまだ作っていないけど編集は可能になったよ。
wnck を使った Opera 起動チェックも行っている、しかし私以外に使う人がいるのだろうか?。
見た目は前回と変わらない、いや、セパレータのラインなんかは表示するようにしたけど。

seeme4_t6

seeme4_t6.tar

ところで Gtk# をやっていた頃にもリンクしたけど

PyGTK FAQ Entry

GtkListStore で手前の GtkTreeIter を得て順番を入れ替える方法なんですけど。
PyGtk における GtkTreePath は単なるタプルなので

def on_item_up(self, widget, event=None):
    selection = self.custome_treeview.get_selection()
    model, it = selection.get_selected()
    if it:
        path = model.get_path(it)
        if path[0] > 0:
            path2 = (path[0]-1, )
            itprev = model.get_iter(path2)
            if itprev:
                model.swap(it, itprev)

def on_item_down(self, widget, event=None):
    selection = self.custome_treeview.get_selection()
    model, it = selection.get_selected()
    if it:
        itnext = model.iter_next(it)
        if itnext:
            model.swap(it, itnext)

とまあコレでイケちゃうんですね、無駄に型に厳しい Gtk# でやるより楽。
WPF の ListView はデータの加減算だけでイケるけど GTK+ はチト面倒なのが本音。
それでも GtkTreeView から得られる情報のみで賄えるのが嬉しい。
データと表示が繋がっているってやはり素晴らしい、Windows SDK じゃありえない。

Table Layout

今日の SeeMe for Linux バックアップ。

自分の設定は保存するようにした、

~/.seeme/seeme4.ini

に作成しますので試したい奇特な人はお気をつけて。

seeme4_t5

seeme4_t5.tar.gz

とりあえず GtkTable でエディタ部分をレイアウトしてみたけどイマイチ。
あまりのんびりと作るのもあれなのでこのままいくと思うけど。
GtkTable って HTML のようにセルをまたいでレイアウトできるが…
こういうのには向かないみたい。

せっかくエディタ部を別個のクラスにしてみたはいいのだけれど
GtkListStore の値を参照する必要があるのでシグナル処理は本体というはめに。
GtkTreeSelection で選択状態を知る必要があるしどうにもならん。

んで編集できるようにまで作ったけどまだ保存はできない。
だってデフォルトのほうの処理をまだ作っていないもので。

ところで
inifile 読み書きクラスと読み込み専用クラスで同じメソッドを持ってもしょうがない。
ということで InifileBase クラスを作って継承するように変更したんだけど。
先頭にアンダースコア2つのメソッドだと継承先から直接利用できないんですね。

そんなの Python の常識だろ?と思う人もいるんでしょうけど私は実践しないと覚えない人なので。

しかし、検索していてよく見かけるんだが…
INI を読み書きする程度のクラスすら自分で作れないプログラマーって何が作れるんだろう?

PyGtk Python Protocol Support

今日の SeeMe for Linux バックアップ。
まだ編集も自分の設定を保存もできないのに公開してよいものか?

seeme_t4

seeme4_t4.tar.gz

そういえば今まで GtkListStore を for ループすると何が取れるか知らなかった。

14.2. The TreeModel Interface and Data Stores

の「14.2.7. Python Protocol Support」をよく見ると

gtk.TreeModelRow

コイツなんだね、ということは…

# Default Delete as No append
default_delete = False
if not en.Deleted:
    for row in self.default_liststore:
        uid = row[13]
        if uid == en.UNIQUEID:
            row[0] = False
            default_delete = True
            break
    """ 下記と同じ
    it = self.default_liststore.get_iter_first()
    while it:
        uid = self.default_liststore.get_value(it, 13)
        if uid == en.UNIQUEID:
            self.default_liststore.set_value(it, 0, False)
            default_delete = True
            break
        it = self.default_liststore.iter_next(it)"""

ぐは!今までなんと無駄な処理をしていたことか。
無理に GTK+ の仕様に合わせずとも PyGtk が用意してくれた方法を使ったほうが楽だ。
なんつーか恐るべし PyGtk だと。

strip

今日の SeeMe for Linux バックアップ。

seeme_t3

seeme4_t3.tar.gz

Iinifile クラスで lng を読み込むと糞遅いので又 InifileReader クラスを作ったけど

class InifileReader():
    def __init__(self, filename):
        self.filename = filename

    def __get_value(self, section, key):
        if os.path.exists(self.filename):
            section_in = False
            f = open(self.filename)
            try:
                for linenn in f:
                    line = linenn.strip()
                    if line == "":
                        continue
                    if section_in:
                        if "=" in line:
                            pos = line.index("=")
                            if key == line[:pos]:
                                return line[pos+1:]
                        if len(line) > 2 and line[0] =="[" and line[-1] == "]":
                            return None
                    if len(line) > 2 and line[0] =="[" and line[-1] == "]":
                        if section == line[1:-1]:
                            section_in = True
            finally:
                f.close()
        return None

File オブジェクトでループができてしまうんだ、これはかなり微妙。
StreamReader とか専用のクラスを作っている .NET のほうが遥に解りやすいんですけど。
改行が含まれてしまうので strip() しないと面倒くさいし。

それと .NET をやった後に Python の open() を使うと少し変な気分。
finally で open したファイルを閉じる必要は Python では無いわけだが .NET では必須。
IronPython ではどっち?