Programming」カテゴリーアーカイブ

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 ではどっち?

Reduce the object named

今日の SeeMe for Linux バックアップ。
まだ GtkTreeView には辿り着けないが大まかな外枠だけは作れた。

seeme4_t2.tar.gz

seeme_t2

今改めて作っていると色々と便利なアイデアが思い浮かぶ。
Y901x では設定で使う GtkNotebook は全部個別に名前を付けたオブジェクトを作成していたが

# GtkNoteBook
self.note = gtk.Notebook()
tab_label = ["カスタムサーチ", "デフォルトサーチ", "標準設定", "バージョン"]
page = []
for i in range(4):
    tab = gtk.Label(tab_label[i])
    page.append(gtk.VBox())
    page[i].set_border_width(10)
    self.note.append_page(page[i], tab)
# page pack
label1 = gtk.Label("test")
page[0].pack_start(label1, False, False)

こんなふうに GtkVBox のポインタをリストすればパッキングはリストの添字で華麗にアクセス!
オブジェクト指向のオブジェクトって結局ポインタですから普通に List に入れられます。
しかも Python は List から取り出すのに型キャストや as 演算子は不要のようです。

タブのラベルは GtkLabel を作るしか無いけどそのためだけにソレに名前を付けるのも無駄だし。
名前付きオブジェクトをなるべく減らしたほうがコードの見通しが絶対にいいですから。

GUI 作成に VC# や Glade を使うと全部名前付きオブジェクトにするしか無いですから。
XAML や GtkUIManager を活用すればかなり減らせるけど少しのアイデアで綺麗にできる。
どうも Glade で作っていた頃の思い込みが消えていないようだ。

後なんとかしたいのはやはり現行版 SeeMe のメイン編集部分である。
あの TextBox や CheckBox をズラズラ並べた配置は作った本人は気に入っていない。
解りやすいとは思うけどもっとスマートにしたい、あれでは XAML もキタナイ。

それと何もアイテムが無い状態ではメイン編集部分を無効状態にしたほうがよさそう。
以上メモ、さて続きをやるか。

MIME Type is disjoint

そういえば Windows の MIME Type はどうなっているのだろう?

MIMEタイプの取得・判定 – Programming/Tips – 総武ソフトウェア推進所

ふむふむ、そうやるのか。
Windows の場合は拡張子が全てなので Python の mimetypes モジュールでよさげだが。
せっかくなので試してみよう。

# -*- coding: UTF-8 -*-

import clr

clr.AddReferenceByPartialName("PresentationCore")
clr.AddReferenceByPartialName("PresentationFramework")
clr.AddReferenceByPartialName("WindowsBase")

from System import *
from System.IO import *
from System.Windows import *
from System.Windows.Controls import *
from Microsoft.Win32 import *

class MimeTypeWindow(Window):
    """
        Get MIME Type for Windows
    """
    def __init__(self):
        self.Width = 320
        self.Height = 240
        self.Title = "MimeTypeWindow"
        self.AllowDrop = True
        self.Drop += self.on_drop
        self.textblock = TextBlock()
        self.textblock.Text = "Drop"
        self.Content = self.textblock

    def on_drop(self, sender, e):
        files = e.Data.GetData(DataFormats.FileDrop)
        ext = Path.GetExtension(str(files[0]))
        if ext:
            key = Registry.ClassesRoot.OpenSubKey(ext)
            if key:
                s = key.GetValue("Content Type")
                if s:
                    self.textblock.Text = s
                else:
                    self.textblock.Text = "No MimeType"
            else:
                self.textblock.Text = "No Registry Key"
        else:
            self.textblock.Text = "No Extension Value"

if __name__ == "__main__":
    a = Application()
    a.Run(MimeTypeWindow())

今頃知ったけど .NET Framework の null は None でイイんだね。
これと Python の mimetypes モジュールとでどうなるか試す。
ぱぇぽぃ2 ? Blog Archive ? Get MIME Type and Description
で GNOME と違うのかもついでに、zip アーカイブを試す。

mime_all

あら…
ついでに Opera は Linux 版なのに

opera_mime

なんというか、やっぱりアプリケーションによってバラバラだよ。

SeeMe v4 as IronPython + WPF

ということで
SeeMe v4 は IronPython + WPF で作ることにしました。
Opera 10 正式版のファイル名やディレクトリ構成がどうなるか解らない状態だけど。

ユーザーに IronPython 2.6 のインストールを強要という暴挙ですが…
まあいいじゃないか、私は Opera より「気軽な開発」を普及させたいんだから。

seeme401

まだ Custom search.ini の読み込み部分しか作っていない。
しかし IronPython も単純に open() で開くと UTF-8 として読み込むんだね。
StreamReader を通しているのだろうけどコレなら楽チンだ。

しかし v3 と同じ外観ではつまらない。
何か面白いインターフェイスにできないかな?と模索中。
ということでここまでのバックアップ。

seeme_a401

それにしても VirtualBox 上の Windows 7 での開発はやはり辛い。
しばらく Vista HDD に戻すか悩むところ。

Linux 版はあまりにも需要が無さ過ぎるので終了する予定。
だって検索バーをドロップダウンで文字入力不能になるのでは…
v10 でなんとかなるのを期待していたんだけーがなぁ。