Python」タグアーカイブ

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

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

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