Python」タグアーカイブ

GNOME3 and PyGtk3

Fedora 15 beta を試している、もちろん HDD インストールで。
しかし何故かアプリのインストールがうまくいかないのでデフォルト状態のみ。

AMD 880G 内蔵グラフィックで GNOME3 の 3D デスクトップはイケる。
ダイアログの表示がカッチョイイ、まんまコレだった。
GNOME 3 – Made of Easy

日本語フォントは今までどおり VL ゴシック。
アプリも 14 とあまり変わらない、GNOME アプリは全部 GTK3 化されている。
GUI では gnote が無くなったくらいかな、使い込んでいないから細かい違いは解らない。
mono はやはり無かった、Fedora は本当に mono が嫌いであるようです。

Windows でいうタスクバーがなくなったのでチト迷う。
アクティビティをクリックして選択、使い勝手は微妙。

Nautilus の左ペインはツリー表示にできなくなってしまったの?
というかデスクトップに物が置けない、XDG_DESKTOP_DIR 指定が無意味。
ゴミ箱とかのウィジェットがタスクバーに表示できなくなった?
細かい設定ファイル類が微妙に今までと位置が違う。

仮想デスクトップは今までと違い何かウインドウを置くと一つ追加になる方式っぽい。
アクティビティをクリックして右端にマウスを持っていくと選択できる。
すべてのウインドウを閉じた仮想デスクトップは自動で消える、なるほどという感じ。

通知スペースはマウスを右下に持っていくと表示される。
私の作った clipolix もココに配置された。

なんというか、とにかく何をやるにもマウスをいっぱい動かす必要がある。
アイコンも大きいしタブレットだと凄く便利そうなんだけど慣れるまで迷いそう。

Firefox は GTK2 だと思うけどスクロールバー等のウィジェット形状が以前のまま。
GTK3 のアプリかどうかはウィジェット形状で見分けがつくってことみたいね。

~/.local/share/gedit/plugins
に gedit プラグインを置けばいいみたいだけどまるっきり仕様が変わっている。
拡張子も違うし import も継承元も callback 名も全部変更されている。
まいった、移行するなら全部作り直しか。
Gedit/PythonPluginHowTo – GNOME Live!

上記の Plugin URL を見て気がついたけど PyGtk で GTK3 が使えるんだね。
gi.repository.Gtk という名前空間(モジュール)でイケるようだ。

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

from gi.repository import Gtk

class Test(Gtk.Window):
    def __init__(self):
        Gtk.Window.__init__(self)
        self.connect("delete-event", Gtk.main_quit)
        cb = Gtk.CheckButton("Check Button だよ")
        cb.set_active(True)
        self.add(cb)
        self.show_all()

if __name__ == '__main__':
    w = Test()
    Gtk.main()

おぉ、GTK3 のウィジェットだ。
こうすればいいのか、あまり GTK2 の時と変わっていないみたいだね。
コレさえできれば私は素直に GNOME3 に移れる。

でも Gedit で External Tool に追記しても動かないんだが…
まだベータだし、とりあえず正式版が楽しみだ。

Python and .NET Methods

.NET と Python メソッド対応表 – L’Isola di Niente

自分で利用したかったので作ってみた。
ついでに覚書ページのも少しまとめた、整理進んでねぇ…

表を作るので何年かぶりに table タグを使おうと思ったけど面倒くさい。
せっかく PHP なんだからコードで作ってしまえ!
ということでこんなのを作ってみた、PHP に関しては私はサルです。

<html>
<head>
<meta content="text/html; charset=utf-8" http-equiv="content-type" />
<title>PHP table</title>
<?php
function put_table($items, $count, $separator) {
    echo "<table border=1 cellspacing=0 cellpadding=3>\n";
    $header = true;
    $array1 = explode("\n", $items);
    foreach ($array1 as $s1) {
        $array = explode($separator, $s1);
        echo "<tr>\n";
        for ($i=0; $i<$count; $i++) {
            if ($header) {
                echo "<th bgcolor=\"#eeeeee\">$array[$i]</th>";
            } else {
                echo "<td>$array[$i]</td>";
            }
        }
        echo "</tr>\n";
        $header = false;
    }
    echo "</table>\n";
}
?>
</head>
<body>
<?php
$items = <<<ITEMS
名前|デスクトップ|リリース予定
Ubuntu 11.04|Unity|2011-04-28
Fedora 15|Gnome 3|2011-05-24(2011-04-19 Beta)
Mandriva 2011|KDE 4|2011-06-13
ITEMS;
put_table($items, 3, "|");
?>

</body>
</html>

みたくヒア・ドキュメントにしてセル数とセパレータ指定にしてみた。
ヒア・ドキュメントなら後で書きたしや書き換えをやりたくなっても簡単だ。

PHP は HTML 中にそのまんま書き込めるから楽でいいよね。
まぁ言語仕様はどうかとは思うけど…

しかし次の Linux はドレでいくかなぁ?
GTK+ 3.0 がやりたいので Fedora にしたいけど初版は不安定かもしれないし…

GNOME 3.0 depends on Mono

4 月、新しい Linux がワンサカ出る季節になった。
ついに GNOME3 が Fedora に正式採用されるようです。

Linux Daily Topics:2011年4月5日 Fedora 15のGNOME 3は慣れるまでに時間がかかるかも─Fedoraアンバサダー|gihyo.jp … 技術評論社

って GTK+ も GTK3 になるのか、そりゃそうだ!
おいらの PyGtk アプリはどうなる、GTK2 のアプリは動くの?
Python も可能ならいいかげん 3 にならないか、2 に依存しすぎて無理かも。

fedora はコレを落としてみたけど完全に作りかけだよ…
独学Linux:Fedora15(Lovelock)の開発版

Ubuntu 11.04 はベータが出ている。
とにかく VirtualBox で動かして解る範囲でチェック。

Ubuntu は基本 GTK2 のままか、正式版で何がどうなるか解らないけど。

Python から PyGtk を使うと Fedora も GTK2 になる。
pygtk.require(‘3.0’)
とやりたくても現状 site-packages に gtk-2.0 ディレクトリしか無い。

そういうわけで Y901x も起動できる。
今までの GTK2 アプリも PyGtk も問題無しということでいいのかな。。

Ubuntu は GtkMenuBar が Mac 風になる、変則配置の Y901x はどうなる?

あれ、メニューがあるはずの部分が少しズレているけど問題無いみたい。
動画の縦ピクセル数も合っている、これなら得に変更する必要は無いかな。
GtkMenuBar.allocation.height がゼロを戻しているのだろうきっと。

とりあえず Ubuntu がこのままなら我がアプリは 11.04 でもイケるようだ。
今まで Ubuntu の更新毎にどこかがおかしくなっていたけど…
何も問題がないってのも逆に面白くないな…

ついでだから 11.04 のデフォルトアプリを見てみる。
OOo が LiberOffice に変わっている。
なんと Tomboy が残っている、今渡こそ Gnote になると思っていた。
Rhythmbox が Banshee に、だから何故 mono 製を選ぶかな…

GNOME3Myths – GNOME Live!

GNOME は mono 依存に戻ったのか。
Fedora にも mono が復活するのだろうか?アルファ版には無いんだが。
つか GTK3 が Gtk# から使えるということなのかな、Python はどうなる?

とにかく Fedora のベータ待ちだ、ディストリ側がどうするか解らないと。
場合によっては Fedora 移行に再挑戦するつもり。

clipolix 1.0.0

clipolix 1.0.0 公開しました。
何も難しくはなかったけどメニューのリロードで迷った。
一度 gtk.Menu.remove() で全削除して作り替えたら消えるし…

なんてことはない、show() させていなかっただけだった。
GTK+ のウィジェットはデフォルトが非表示なのよね、逆に面倒くさいよ。

他シグナルのハンドラを on_* にしたり細々。
ま、こまかいことは GPL なのでということで。

notification area XPM Icon

clipoli の Linux 版作成の続き。

C# ソースコードで配布の Windows 版と同様に変なことがやりたい。
このアプリを使ってもらいたいという理由で作っているわけじゃないのよ。
Windows も Linux も他に何もインストールせずこんなことができる!を伝えたい。
Linux 版はたった一つの Python スクリプトで全部まかなうという方向でいく。

とりあえず通知スペース用アイコンをオリジナルに。
/usr/share/pixmaps に XPM を放り込んで…
をやりたくないのでコードに埋め込む。

Windows から clipoli 用に作ったアイコンを持ってくる。
Gimp で開いて XPM に変換保存、拡張子を xpm で保存するだけの全自動。
XPM ファイルを Gedit で開き Python スクリプトにコピペ。
static char 配列を List に書き換える。

#static char * icon_xpm[] = {
#};
# ↓
icon = [
]

###

tray = gtk.StatusIcon()
xpm = gtk.gdk.pixbuf_new_from_xpm_data(icon)
tray.set_from_pixbuf(xpm)

これだけでオリジナルアイコン処理は完成。

INI ファイル読み込みは下記の lead_lines 関数で。
C# で以前作ったのと比較にならないほど短い!
やっぱり構造体を用意する必要が無いって素晴らしい。

[Launcher]
メモ帳=gedit
端末=gnome-terminal
localhost=xdg-open http://localhost/

[Clipboard]
黒=ほむほむ
赤=あんこ
私ってほんとバカ=こんなの絶対おかしいよ

なんて test.ini を用意して実験。

#! /usr/bin/python
# -*- encoding: utf-8 -*-

import pygtk
pygtk.require("2.0")
import gtk
import os

icon = [
"32 32 3 1",
" 	c None",
".	c #000000",
"+	c #FFFFFF",
"                                ",
"   ............                 ",
"   .++++++++++.                 ",
"   .++++++++++. ......          ",
"   .++++++++++. .++++.          ",
"   .++++++++++. .++++.          ",
"   .++++...+++. .++++.          ",
"   .++++....... .++++.          ",
"   .++++.       .++++.          ",
"   .++++.       .++++.          ",
"   .++++.       .++++. ......   ",
"   .++++.       .++++. .++++.   ",
"   .++++.       .++++. .++++.   ",
"   .++++.       .++++. .++++.   ",
"   .++++.       .++++. ......   ",
"   .++++.       .++++.          ",
"   .++++.       .++++. ......   ",
"   .++++.       .++++. .++++.   ",
"   .++++.       .++++. .++++.   ",
"   .++++.       .++++. .++++.   ",
"   .++++.       .++++. .++++.   ",
"   .++++.       .++++. .++++.   ",
"   .++++.       .++++. .++++.   ",
"   .++++.       .++++. .++++.   ",
"   .++++....... .++++. .++++.   ",
"   .++++...+++. .++++. .++++.   ",
"   .++++++++++. .++++. .++++.   ",
"   .++++++++++. .++++. .++++.   ",
"   .++++++++++. .++++. .++++.   ",
"   .++++++++++. .++++. .++++.   ",
"   ............ ...... ......   ",
"                                "]

def read_lines(filename):
    if os.path.exists(filename):
        f = open(filename)
        x = f.read()
        f.close()
        lines = x.split("\n")
        section = ""
        for line in lines:
            if line == "": continue
            if line[0] == ";": continue
            if len(line) > 2 and line[0] =="[" and line[-1] == "]":
                section = line[1:-1]
            elif section == "":
                pass # Nothing
            elif "=" in line:
                pos = line.index("=")
                yield (section, line[:pos], line[pos+1:])


class TrayItem(gtk.Menu):
    def __init__( self, trayIcon):
        gtk.Menu.__init__( self)
        self.tray = trayIcon
        # ini
        filename = os.path.join(os.path.dirname(__file__), "test.ini")
        for section, key, value in read_lines(filename):
            m = gtk.MenuItem(key)
            m.set_name(value)
            if section == "Launcher":
                m.connect("activate", self.on_launcher)
            elif section == "Clipboard":
                m.connect("activate", self.on_clipboard)
            self.append(m)
        self.append(gtk.SeparatorMenuItem())
        q = gtk.MenuItem("終了(_X)")
        q.connect("activate", self.on_quit)
        self.append(q)
        self.show_all()

    def on_launcher(self, widget):
        l = widget.get_name()
        os.system("%s &" % l)

    def on_clipboard(self, widget):
        c = gtk.Clipboard()
        c.set_text(widget.get_name())

    def on_quit(self, widget):
        gtk.main_quit()

    def show_menu(self, widget, button, time):
        self.popup( None, None, gtk.status_icon_position_menu, 0, time, self.tray)

    def show_menu_act(self, widget):
        self.popup( None, None, gtk.status_icon_position_menu, 0, 0, self.tray)

if __name__ == '__main__':
    # Create GtkStatusIcon and GtkMenu
    tray = gtk.StatusIcon()
    trayMenu = TrayItem(tray)
    # Icon as XPM data
    xpm = gtk.gdk.pixbuf_new_from_xpm_data(icon)
    tray.set_from_pixbuf(xpm)
    # Left and Right Click
    tray.connect( "popup-menu", trayMenu.show_menu)
    tray.connect( "activate", trayMenu.show_menu_act)
    gtk.main()

それっぽくなってきた。
KDE でも使える、ランチャするアプリは KDE に合わせなきゃいけないけど。
下は Mandriva で試してみた画像。

てかアプリ名はいかに、clipolix と又 x のサフィックス付きにするつもりだが。
SeeMe for Linux も次回から SeeMex にしよう、名前が長くて面倒だし。
てゆーか今の Opera ではあんまり SeeMe の意味が無くなっているんだが…