Python」タグアーカイブ

Python getter, setter

Python は 2.6 以降の property でゲッターセッターが使えるらしい。
IronPython 2.6 でも使えるのかな?両方で実験。

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

class Engine(object):
    """
        over 2.6 property getter,setter test
    """
    @property
    def name(self):
        return self._name

    @name.setter
    def name(self, value):
        self._name = value
        print "(%s) get!" % value

    @name.getter
    def name(self):
        print "out"
        return "name as %s" % self._name

if __name__ == "__main__":
    # static test
    #Engine.name = "Toyota"
    #print Engine.name
    # instance test
    eg = Engine()
    eg.name = "Honda"
    print eg.name

getset

static でも property はアクセスできるけどセッターやゲッターは無視される。
オブジェクト生成を行ったのであれば普通にセッターやゲッターとして使える。
IronPython でも 2.6 なら有効なのが嬉しいですね、まだ 2.6 はベータですが。

getter は書かなくても良い、普通は setter 時に何か event を起こすのに使うものですし。
C# と違い実体は書く必要は無いようです、しかしイマイチ解りにくい書き方ですよね。

これを利用して IronPython で ObservableCollection を作って ListView を…
とやっているんだけーが上手くいかないのでまたこんど。
PropertyChanged は IronPython ではどう書けばいい???

第2章 ListView 1/1 – 続・ひよ子のきもち

こんな強烈な IronPython 屋さんが日本にいたんだ。
今まで検索に引っかからなかったのは何故だろう、探し方が悪いのか?
とにかく参考にさせてもらおう、メモメモ。

Enjoy!

グラフィックコンテキストの色はもっと簡単に変更できた

グラフィックコンテキストの色はもっと簡単に変更できた

set_rgb_fg_color(gtk.gdk.color_parse("red"))

で expose-event の中でも CPU 負荷もなくアッサリ変更できる。
GTK+ はデフォルトがダブルバッファリングなのでチラツキも全然無い。
チビッと試しに書いてみた。

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

import gtk
import pango

ui_str = """<ui>
    <menubar name="MenuBar">
        <menu action="File">
            <menuitem action="quit"/>
        </menu>
    </menubar>
</ui>"""

class GC_Test(gtk.Window):
    """
        GC で色々な表示を試してみる
        Font を変更するには pango を使う必要があるのね
    """
    def __init__(self):
        # お約束
        gtk.Window.__init__(self)
        # GtkUIManager 作成
        uimanager = gtk.UIManager()
        # GtkAccelGroup を取り出し self にて突っ込む
        accelgroup = uimanager.get_accel_group()
        self.add_accel_group(accelgroup)
        # GtkActionGroup 作成
        actiongroup = gtk.ActionGroup("nandemoii")
        # GtkActionEntry の list を作成して GtkUIManager に突っ込む
        e = [("quit", gtk.STOCK_QUIT, "終了(_Q)", "<Control>Q", "さいなら", self.on_quit),
            ("File", None, "ファイル(_F)") ]
        actiongroup.add_actions(e)
        # GtkUIManager の更新
        uimanager.insert_action_group(actiongroup, 0)
        uimanager.add_ui_from_string(ui_str)
        # メニューを取り出す
        menubar = uimanager.get_widget("/MenuBar")
        # パッキング
        statusbar = gtk.Statusbar()
        drawingarea = gtk.DrawingArea()
        #
        # ダブルバッファリング無効状態にしたいならココを有効にしてね
        #drawingarea.unset_flags(gtk.DOUBLE_BUFFERED)
        #
        # WM_PAINT のようなものを発生させる
        drawingarea.connect("expose-event", self.on_drawingarea_expose)
        # パッキング
        vbox = gtk.VBox()
        vbox.pack_start(menubar, False)
        vbox.pack_start(drawingarea)
        vbox.pack_end(statusbar, False)
        self.add(vbox)
        # いつもの処理
        self.set_title("gc_test")
        self.connect("delete-event", self.on_quit)
        self.resize(320,240)
        self.show_all()

    def on_quit(self, widget, event=None):
        gtk.main_quit()

    def on_drawingarea_expose(self, widget, event=None):
        # グラフィック・コンテキストを得る
        gc = widget.style.fg_gc[gtk.STATE_NORMAL]
        # 赤くする
        gc.set_rgb_fg_color(gtk.gdk.color_parse("red"))
        # 自分のサイズ取得
        d_width = widget.allocation.width
        d_height = widget.allocation.height
        # 塗りつぶす
        widget.window.draw_rectangle(gc, True, 0, 0, d_width, d_height)
        # 緑色にする
        gc.set_rgb_fg_color(gtk.gdk.color_parse("green"))
        # Font を大きくして文字列描写
        font_desc = pango.FontDescription('Monospace 32')
        layout = widget.create_pango_layout ("まっかっか")
        layout.set_font_description(font_desc)
        widget.window.draw_layout(gc, 10, 20, layout)
        # 青色にする
        gc.set_rgb_fg_color(gtk.gdk.color_parse("blue"))
        # 線
        widget.window.draw_line(gc, 0, 0, d_width, d_height)

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

makkakka

これでどこをどう書けばどういう表示になるか簡単に解る…と思う。
2D にしてグリグリウインドウサイズを変更するとチラツキが無いのも理解できる。
ダブルバッファリングを無効にする方法もついでに。

PyGtk って何でもやれて面白いですよ。

keywords

今月も mono が多い…そんなに Linux で C# なんかやりたいの?
キッカケだけならそれでいいけど、私がそうだったし。

os.path.join() は理由がある

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

import os

# コレだとカレントディレクトリの場合は空文字になる
print os.path.dirname(__file__) + "/put.txt"
# 正確に行う方法
print os.path.abspath(os.path.dirname(__file__)) + "/put.txt"

output

今頃知った。
ま、実用上は絶対パスにしなくても得に問題は…ある!

このままだとファイル名の先頭がパス区切り文字になる場合があるってことじゃないの。
os.path.join() で合体しろと強調する理由はコレだったのね。
単純にパス区切り文字を振り分けというくだらない理由だけじゃなくて。

それよりこうやって Linux と Windows での表示を比べると…
せめて PowerShell だけでも Windows の標準カレントディレクトリをなんとかしてほしいわ。
変更できるのは解っているけど最初から C:\ユーザー名 でいいじゃないか。

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 を更新するのもアレなので今度まとめてにしよう。

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 取得方法くらいは解説しなきゃ誰も始められないかなと。
こんなのをチビチビ作っているが需要は微妙である。

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