Python」タグアーカイブ

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 はこんなに軽かったっかな?

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!

Get MIME Type

ファイル情報取得で MIME Type を取得したい。
mimetypes モジュールでは拡張子判別しかできないみたいですけど。
Nautilus は拡張子が優先だけど無くても取得できているじゃないか。
ということで地味に方法を探してみる。

ファイルの MIME タイプの検出 (GNOME 2.2 システム管理 (Linux 版)) – Sun Microsystems

/etc/gnome-vfs-mime-magic
/etc/mime.types

のファイルが元ということになっているみたいなんだが Ubuntu では

ubuntuで対応しているMIME Typeを調べるには:Linux つれづれ日記:So-net blog

/usr/share/mime 以下なのか。
xdg-mime は MIME Types のインストール関連に使うものだがどっちに登録するのかな?

つーか Nautilus が取得できているんだから絶対にシェルから取得できるはずだ。
色々調べていたらこんなのを見つけた。

Nautilus File Manager Scripts: File Information Querying Scripts

file コマンドだけでこんなことができるのか。

$ file --help

で調べると –mime-type オプションがあるらしい、それならこうしてみよう。

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

import gtk
import urllib
import os.path
import commands

class MimeWin(gtk.Window):
    """
        Showing MIME Type 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:
            name = urllib.unquote(drop)[7:-1]
            if os.path.isfile(name):
                # Get MIME Type
                mime = commands.getoutput("file --mime-type %s" % name)
                self.label.set_text(mime)

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

ext_non

おお、しっかり取得してくれているじゃないか。
しかし Python Script では

ext_py

text/x-java …
text/x-python のはずなのに、ダメだこりゃ。

mime = mimetypes.guess_type(name)[0]
if mime:
    self.label.set_text(mime)
else:
    self.label.set_text("Non Extension")

ならキチンと text/x-python になる、しかし拡張子が無いなら None になる。
んーどっちも使えない、もうちょっと調べます。

Enjoy!

create_small_image Nautilus-Script

次の覚書は GtkUIManager を利用してツールバーに独自画像を。
とやりたかったけどストック以外を指定する方法が無いみたい。
一旦個別に抜きだしして割り当てるならできそうだけどどうしよう。

ところで

gtk.gdk.Pixbuf

GDK-PixBuf には save というメソッドがあるんだね。
これは…上手く使えそう。

たとえば blog に使う大きな画像へのリンク用の小さな画像作りなんかに。
これを Nautilus スクリプトにしてしまえばそのためだけに Gimp を利用する手間が省ける。
ということで試しに書いてみる。
生成する画像の名前は WordPress が付ける名前に合わせサイズを付加する例。

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

"""
    create_small_image Nautilus-Script
    written in Python.
"""

import gtk
import os

path_array = os.environ["NAUTILUS_SCRIPT_SELECTED_FILE_PATHS"].split("\n")
for picfile in path_array:
    try:
        pixbuf = gtk.gdk.pixbuf_new_from_file(picfile)
    except:
        continue
    # Under 300*300 image
    d_width = 300
    d_height = 300
    # GdkPixbuf size
    p_width = pixbuf.get_width()
    p_height = pixbuf.get_height()
    # Calculated to fit the smaller
    width = 0
    height = 0
    if (d_width * p_height) > (d_height * p_width):
        width = p_width * d_height / p_height
        height = d_height
    else:
        width = d_width
        height = p_height * d_width / p_width
    # Create Resizeing GtkPixbuf
    small_image = pixbuf.scale_simple(width, height, gtk.gdk.INTERP_BILINEAR)
    # Create small_image Name
    pos = picfile.rindex(".")
    image_name = "%s-%dx%d.png" % (picfile[:pos], width, height)
    small_image.save(image_name, "png")

で、Nautilus script に登録する。
Nautilus で画像を選択状態にして右クリックメニューからスクリプトを選択。

sclipt_menu

で、画像があるディレクトリに縮小された画像が生成されているはず。
てかおいおい、こんな簡単にスモール画像が作れちゃったよ。
今まで書いたスクリプトを組み合わせただけなので製作時間 15 分。

さてコレを覚書ページに…どこに入れればいいのだ?
よく解らないから blog に書いてみた。

追記

また script を sclipt と書いていた…ので書き換えておます。

Enjoy!

Python is doing in Linux

ぱぇぽぃ2 ? Blog Archive ? ラジオメニューとトグルボタンの同期

をもう少しまともに解説、やはり実際に使えるコードでないと動作を実感しないだろうから。

GtkRadioAction でラヂオメニューとツールバーを同期させる

しかし GtkRadioActionEntry の value 引数に直接値を入れたのは我ながらナイス。
ついでにココも大幅に追記、これも以前 Blog のほうで書いたコードだったりする。

テキストや図形を描写する

思いつきを Blog でやって覚書ページにまとめると決めていたがサボってばかりだ。
しかし自分で書いたコードを探すのに自分の Blog を検索するのって何か変な気分。

しばらく IronPython ばかりやっていたのですがやはり Linux で PyGtk のほうが面白いです。
なんたってすぐに起動できる、簡単に書けるようにバインディングされている、端末操作も楽。
なにより、メソッドの先頭が大文字という違和感が PyGtk には無いのが一番嬉しい。
.NET Framework はクラス名なのかメソッドなのかプロパティなのか解りにくい。

というか… .NET Framework は単純なものを作る場合は短いコードで住ませられるんだけど。
少し凝ったことをしようとすると嫌がらせとしか思えないほど面倒になってタマラン。
.NET Framework とは仮想マシンであり Windows では無いのが少し解ってきた今日この頃。
要求する新たな知識がハンパないので新参プログラマーはカワイソウ。

Devhelp を見て
「ならば PyGtk ではこう書けばイケるだろう」
が通用する PyGtk って楽だなぁと感じた今日この頃。
SDK Help はこう作って欲しいです、MSDN 様。

Enjoy!