月別アーカイブ: 2009年5月

GtkMenu.popup で左右両ボタン認識は簡単だった

今日はこのページを作っていたのだが

ドロップされた画像を表示させる

ここで今まで右クリックメニューを出すコードに右ボタンを指定を忘れていたことに気がつく。
ごまかす為に以前のページを書き換えていたのだが

if event.button == 3:
    self.popup_menu.popup(None, None, None, event.button, event.time)

event.button を何故二回も使っていたのだろう。
Devhelp を改めて見直すと popup の四番目引数はボタンの指定だ。
つまりメニューアイテムの選択を確定させるボタンということである。

あぁだからポップアップの入れ子は右ボタン(つまり 3 )しか反応しないのか。
ここに左を示す 1 を含めた値…int なんだから 4 になって全然違うボタンの指定になってまうし…
だったらゼロにするとどうなる?

if event.button == 3:
    self.popup_menu.popup(None, None, None, 0, event.time)

コレであんなに悩んだ入れ子メニュークリックでの左右両ボタンでの確定がアッサリ解決…
何故こんな単純なことに今まで気がつかなかったのだろうか…
これだけで Y901x を更新するのもアレなので今度まとめてにしよう。

IronPython は親クラスの __init__() がいらない

.NET Framework について何を今頃知ったのだが…
StreamWriter はエンコード指定をしなければ BOM 無し UTF-8 になるらしい。

ま、元々 Opera は付けていたのでSeeme for Linux の場合は問題無いのだが。
UTF-8 を指定すると BOM が付いて困ることがあったので理解しておかなきゃ。

てなわけで実際そうなのか実験コードを IronPython と WPF で書いてみたのだが…
突っ込みどころ満載になってしまった。

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

import clr
#import nt

# 最小限下記ライブラリ(dll)が必要
clr.AddReferenceByPartialName("PresentationCore")
clr.AddReferenceByPartialName("PresentationFramework")
clr.AddReferenceByPartialName("WindowsBase")

from System import *
from System.Windows import *
from System.Windows.Controls import *
from System.Windows.Media import *
from System.IO import *

class UTF8Writer(Window):
    """
        System.IO.StreamWriter の実験
        何も指定せず書き込みすると BOM 無し UTF-8 になる
    """
    def __init__(self):
        """
            IronPython では Window.__init__(self) はいらないようです
            書いても例外にならないけど
        """
        self.Title = "UTF-8 書き込みの実験"
        self.textbox = TextBox()
        self.textbox.TextWrapping = TextWrapping.Wrap
        self.textbox.AcceptsReturn = True
        self.textbox.FontFamily = FontFamily("MS ゴシック")
        # ボタン作成及びクリックハンドラ登録
        button = Button()
        button.Content = "書き込み"
        button.Click += self.onClick
        # StackPanel だとサイズ連動ができないので DocPanel を使う
        # けど何故 static なんだ!
        DockPanel.SetDock(button, Dock.Top)
        # レイアウタを作成してこれらをセット
        dp = DockPanel()
        dp.Children.Add(button)
        dp.Children.Add(self.textbox)
        # レイアウタを Window にセット
        self.Content = dp
        self.Width = 320
        self.Height = 240

    def onClick(self, sender, e):
        """
            流石に以下はできない、nt.path が無い…
            sw = StreamWriter(nt.path.dirname( __file__ ) + "\\put.txt")
        """
        sw = StreamWriter("put.txt")
        try:
            buf = self.textbox.Text
            sw.Write(buf)
        except Exception, ex:
            MessageBox.Show(ex.Message)
        finally:
            sw.Close()

class UTF8WriterCopy(UTF8Writer):
        """
            自作クラスでもコレでイケる、なんか変
        """
        pass

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

writer

なるほど、BOM 無し UTF-8 になることは確認できた。
XP 用の WPF にはフォントにアンチエイリアスを掛けるのをヤメてくんないかなぁ。

つーかナンジャコレ。

今まで気がつかなかったよ、親クラスの __init__ はいらないんだ。
Python じゃ無いヤン、コンストラクタになっているってことだよね。
それとも CLI の仕様なのかな?

更に気がつかなかったけど DockPanel へのレイアウトは static なんだ。
XAML で書いていると普通に見えるけどコードで書くと違和感がたっぷり。
GTK+ とは違ってパッキング情報は子オブジェクト側が持っているということか。

やりにくいのでコンテナの継承をして pack_start みたいなのを作ろうかな?
と思ったけど要求が StackPanel と DockPanel に分かれているし無理っぽい。
WPF は XAML で書くのを強要しているってことだろう多分。

os モジュールのクローン nt を作ったのなら nt.path も用意してくれよみたいな。

まだ気がついていないところってありそうだ。
IronPython は Python クローンだと思って書くと痛い目に遭いそう。
しかし例外の書き方なんかはまったく同じだ、逆に変な気分になった。

テンプレートとスクリプト

nanikore

Nautilus にあるこのテンプレートって何だろうと気になった。
多分よく使うテンプレートをコピーして新規作成してくれる機能だと思う。
私だったら当然

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

とかかな、「 py 」って打って Tab キーを押すだけでスニペットが挿入してくれるけど。
それでもあったほうが便利かなと思うので使い方を探す、が見つからないんですけど。
せっかく堂々とメニューに乗っているのに誰も使っていないのかな?

でも調べているうちにスクリプトで Nautilus が拡張できると知った(今頃…
面白そうと思って早速作ってみた、これで端末のお世話になる時間が減りそうだ。

Nautilus をスクリプトで拡張

しかし gedit といい Nautilus といい gimp といい Eye of GNOME といい…
Opera と自作以外は標準アプリしか使っていないのを思い知る。

しかし他のモンをあんまりインストールしていないので私の 9.04 は超安定しています。

Shift-JIS で読み直しする gedit pligin

Windows から持ってきた Shift-JIS なテキストファイルを gEdit にドロップで開くと文字化け。
Cinema や minipoli のコードを「俺どう書いたっけ?」と自分で参考にする時が結構あるのよ。
もう慣れてしまったけど毎回毎回読み直しするのも面倒になってきた。

Gedit/PythonPluginHowTo – GNOME Live!

一旦破棄して gedit.Encoding 指定で読み込めばプラグインで作れそうだ。
create_tab_from_uri の引数で行ジャンプまで指定できるんだ、これは面白そう。

ということでさっき Shift-JIS で読み直しするプラグインをこさえて本サイト更新!
製作時間は一時間、あぁプラグインは楽でいい。

EUC-JP も考慮しようかと思ったけど私は現在 EUC-JP なファイルを持っていない…
それより意図的に私が作らないほうが「作ってみようかな?」という人が出てくるかも。
なんて思ったので Shift-JIS のみで公開することにした、手抜きじゃないですよ。

それと gEdit プラグインの応用 1 なんてページを増やした。
カーソル位置の GtkTextIter 取得方法くらいは解説しなきゃ誰も始められないかなと。
こんなのをチビチビ作っているが需要は微妙である。

次はサイドバーとかを使いたいんだが…アイデアが浮かばない。

止まりぎみ

覚書のページ更新を又始めたので blog は止まりぎみになるかも。

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

自分で書いていながら目から鱗。
gyk.gdk.Color() で GdkColor を作る時って 16bit だったのか。
ずっと 8bit (0?255 まで)だと思っていた、やっぱり Windows が長すぎだ。
つーか自分は真っ黒しか使っていなかったので全部ゼロだったわけで。

しかしグラフィック・コンテキストは何でこんなにイッパイあるのだろう?
PAINTSTRUCT がやっている部分も全部コンテキストがやっているということかな。
あんまりよく解っていないまま適当に書いているので気にしないで。
多分 GLib から勉強すれば解るんだろうけど。

なんか自力で解説を作っていると勝手に勉強になって楽しい。

しかし、この blog へのアクセスも今月ついに Vista が Ubuntu を抜いた…
今年から Ubuntu と PyGtk のネタがほとんどなのに世間はそうなのね。

全滅状態のデルヒャァ屋さん達はコッチにいらっしゃい、待っているよ。
ティーエディタの代わりに Pygtksourceview2 もあるよ。
キャイリクスは捨ててね。