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

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 だと。

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 もキタナイ。

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

Comix

Comix – GTK Comic Book Viewer

こんなのを見つけた、思いっきり PyGtk 製の画像ビューアである。

私は動画プレイヤー同様で画像ビューアにもそんなには機能を求めていない。
なので Eye of Gnome で十分なんだが 9.04 から急に重くなってっしまったし。
PyGtk の勉強ついでに自分で軽いのを作ろう、と覚え書きページを作っていた。

見事に詰まった…ということで何か参考が欲しい所に見つけたということです。

でも検索すると…
せっかくの Python 製なのに参考にして何か作ってみようという人いないの?
UNIX 系の人はバリバリスクリプトを書いて利用しているイメージが昔はあったのに。

まあそれはよくて。

普通に「追加と削除」にあるのでパッケージ管理のためにインストールはそちらから。
URL を貼ったのは Python コードを参照のために落とす用。

HDD は Vista にしてしまったから VirtualBox 上の 8.10 を使って…
あれ?何もファイルが無い、そういえば 8.10 からはホストに変更したんだっけ。
せっかく Comix をインストールしたのに画像が何も無いとはこれいかに。

しかたがない、手っ取り早くエロサイト…はやめておいて。
この Blog から先月の画像を FTP で丸ごと落とせばいいや。

comix

縮小描写の画質がイマイチですので双一次補完以上にしませう。
GtkRadioAction でラヂオメニューとツールバーを同期させる
image.py でコレと同じようにスケーリングをしているので、名前で解るわな。

tile

こういうのは自前で補完の算出をするより GTK+ にまかせたほうが早い。
なんたってスクリプト言語ですので…まあイイんでないかい。

それはそうとソースコードだ。

GtkUIManager を使ってオリジナル画像や右寄せをしている、コレやりたかった。
方法の解析は…もう少し時間が掛かりそう。

画像は GtkLayout を使って大きさを調節して GtkImage に描写している。
こんな方法があったのか、それなら expose_event シグナルを利用しなくてもイケる。
それでいいのか?という疑問もあるけど。

ステータスバー表示は分割せずにまとめて str で描写。
うーん、私とは随分考え方が違う人のようだ。

予想していたコードとは随分違うけどこれはこれで参考になる。
というか 8.10 の Eye of Gnome はこんなに軽かったっかな?

IronPython in Gtk #

Ubuntu 9.04 で IronPython が動かせるので Gtk# を試してみる。

Mono, Gtk# and ironpython | Kushal , kD & FOSS

まぁ他国ならこんな簡単に見つけることができるんだが。
私がよく書くコードと同様にするなら class を作って

#-*- coding:Latin-1 -*-
"""
Error
#-*- coding:utf-8 -*-
"""

import clr
clr.AddReference('gtk-sharp')

import System
import Gtk

class GtkSharpWindow(Gtk.Window):
    """
        GtkSharp Test
    """
    def __init__(self, title):
        """
            Gtk.Window.__init__(self) is No
            Constructor has been
        """
        # GtkButton
        button = Gtk.Button("Click!")
        button.Clicked += self.on_button_clicked
        # GtkTextView
        self.textview = Gtk.TextView()
        # Packing
        vbox = Gtk.VBox()
        vbox.PackStart(button, False, False, 0)
        vbox.PackStart(self.textview)
        self.Add(vbox)
        # self
        self.DeleteEvent += self.delete_event
        self.Resize(320, 100)
        self.ShowAll()

    def delete_event(self, sender, e):
        """
        	Required
        """
        Gtk.Application.Quit()

    def on_button_clicked(self, sender, e):
        """
            Button Click Signal Handrer
        """
        self.textview.Buffer.SetText("Hello World!")

if __name__ == "__main__":
    Gtk.Application.Init()
    w = GtkSharpWindow("TitleBar")
    Gtk.Application.Run()

mono_ipy1

こんな感じかな。
Gtk.Application.Init() によるライブラリ初期化は必須のようで。
__init__() にはタイトル文字列を入れないと通らない、もっと柔軟にしてくれよ。
親 class の __init__() はやっぱり不要、まぁ Windows 版と同じ exe だし。
pack_start のパラメータは一つか全部しか選べない、PyGtk ならデフォルト引数があるのに。
ShowAll() しないとウインドウを表示できませんので気をつけて。

後は…見ての通り PyGtk とほとんど変わらない。
が、どうしても気になる GtkTextView からの GtkTextBuffer 取得方法。

self.textview.GetBuffer().SetText("Hello World!")

なら解るんだがこんな関数はない。
ついでにメソッドは全部小文字に統一されている GTK+ を何故かキャメルケース化している。
DevHelp が役に立たないような GTK+ バインディングはどうなんだと思うんですけど。

ところで何故 Latin-1 ?って UTF-8 に書き換えてみてよ。

mono_ipy2

意味ワカンネ、つまり未対応ってことかな。
これじゃリテラルに日本語が使えないわな、方法模索中。

つーかやっぱり文字が見にくいのでコレ用に bash のプロファイルを作るはめになったぞと。

Enjoy!

Get MIME Type and Description

ファイル情報取得で MIME Type を取得したい、その2。

GnomeVFS – Wikipedia
[mew-dist 24325] Re: Content-typeの取り扱いについて

なんだ、gnomevfs ってのを使えばいいのか。

gnome-vfs python – Google Search
Python gnomevfs Reference Manual

簡単に見つかった、メリケンの google が便利すぐる。

Finding the MIME type of a file – Community Ubuntu Documentation

方法まであっさり、しかし他国でこの手を探すと Python コードがすぐ見つかる。
日本ってこんなことでもガラパゴス状態なんだよなぁと。
しかしファイルの種類は日本語での取得ができるのかな?試してみよう。

#!/usr/bin/env python
#-*- coding:utf-8 -*-

import gtk
import gnomevfs

class MimeWin2(gtk.Window):
    """
        Showing MIME Type and Description of Dropped file
    """
    def __init__(self):
        gtk.Window.__init__(self)
        dnd_list = [("text/uri-list", 0, 0)]
        self.drag_dest_set( gtk.DEST_DEFAULT_MOTION |
                            gtk.DEST_DEFAULT_HIGHLIGHT |
                            gtk.DEST_DEFAULT_DROP,
                            dnd_list, gtk.gdk.ACTION_MOVE )
        self.connect("drag_data_received", self.on_drop)
        self.label = gtk.Label("Drop")
        self.add(self.label)
        self.connect("delete-event", gtk.main_quit)
        self.resize(320, 150)
        self.show_all()

    def on_drop(self, widget, context, x, y, selection_data, info, time):
        drops = selection_data.data.split("\n")
        for drop in drops:
            if not drop == "":
                name = drop[:-1]
                mime = gnomevfs.get_mime_type(name)
                desc = gnomevfs.mime_get_description(mime)
                self.label.set_text("MIME Type = %s\nDescription = %s" % (mime, desc))

if __name__ == "__main__":
    w = MimeWin2()
    gtk.main()

mime_win2

うん、これなら拡張子無しでもなんでも完璧に Nautilus と同じだ。

dir(gnomevfs)

で見ると更にオイシソウなメソッドが見つかりますね。
ファイル情報取得はこれだけでイケそうです。
ただ GNOME 限定になるのはしかたがない。

Enjoy!