PyGTKだと、一部が透過されたウィンドウというか、その名の通り『四角くないWindow』が簡単に表示できそうだったので、PyGTKを始めてみる。

便利なもの



インストール


上記のページのソースコードをそのままコピペでうまくいったのでとりあえずOK。

Gimpでlogo.pngという名前で透過なpng画像を作成した後、
logo.pngをコピペしたソースコード(windowtest.py)と同じディレクトリへ配置して、

$ python windowtest.py

を実行したら問題なくうまくいった。

一つ、気をつけなければならなかったことは、

#-*- coding: utf-8 -*-

をソースコードの最初に記述しておかないと、
たとえコメントであってもASCII文字以外がソースコード中に出現すると
以下のようなエラーを出してしまうので注意。

SyntaxError: Non-ASCII character '\xe3' in file windowtest.py on line 24, but 
no encoding declared; see http://www.python.org/peps/pep-0263.html for details

いじってみた



ここが何かと参考になりそう。

サンプルプログラムを実行する際に一つ注意点が

emacsで編集する際にファイル先頭で
# -*- coding:UTF-8 -*-
というように文字コードを指定して保存しようとすると
It is highly recommended to fix it before writing to a file.
Warning (mule): Invalid coding system `UTF-8' is specified
for the current buffer/file by the :coding tag.
と怒られる。

調べてみると、同じ症状が出ている人がいた
ここによると
# -*- coding: utf-8 -*-
のように文字コード指定を小文字で行うと治るらしい。

おお、治った。

他にも
が英語だけど参考になります。

Pythonでのクラスの実装については
が参考になります。

gtk.EventBoxについて


透過PNGをWindowの装飾無しで表示できる所までは、サンプルプログラムの通り。

これを、『クリックした時に何か起こす』とかイベント処理と絡めるためには
img = gtk.Image()
img.set_from_file(imageName)
img.connect('button_release_event', self.say_hello)
ということができれば良いのだが、これだと実際に動かしてみてクリックしても何も起こらない

その理由は、「ImageウィジェットがXのイベントを受け取らないから」で、詳しくはこちらに記述してある。
Pythonではないが、GTKの処理自体は同じなので参考になる。

そのために用いるのが「EventBoxウィジェット」で、次のように使う。

ebox = gtk.EventBox()
img = gtk.Image()
img.set_from_file(imageName)
self.add(ebox)
ebox.add(img)
ebox.connect('button_release_event', self.say_hello)

この様に先ほどのプログラムを変更する。

参考:

Python で Linux コマンドを実行する


import commands
print commands.getoutput("date")

この2文で実現可能なようです

ただし、Pythonインタプリタ上だと date のようにLANG環境変数の設定によって日本語で出力するようなコマンドでは、文字化けする場合あり


ハンドラ関数の引数はシグナルの種類によって異なる場合がある


print文について


マウス関係のイベント処理


実行時のデフォルトの表示位置について


gtk.Window.set_position()

で設定できるみたいです。

ここで設定できる定数は
  • gtk.WIN_POS_CENTER -- 画面の中央に表示
  • gtk.WIN_POS_MOUSE -- 現在のマウスの位置に表示
  • gtk.WIN_POS_CENTER_ALWAYS -- サイズが変更されたりしたときも、いつも中央に表示
  • gtk.WIN_POS_CENTER_ON_PARENT -- 親ウインドウの中央に表示
の4つです


右下に表示したいという場合は、こちらが参考になるかも

D&Dの処理について


設定ファイルの読み書きについて


タイマー処理について


Scribes



Pythonで書かれたエディタみたいです。

実際に良いソースコードを読むことが勉強には一番だと思うので、
このソースコードをダウンロードしてみる。

dyna{cupnes}% sudo apt-get source scribes                                   [~]
[sudo] password for cupnes: 
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
NOTICE: 'scribes' packaging is maintained in the 'Svn' version control system at:
svn://svn.debian.org/python-apps/packages/scribes/trunk/
1205kB のソースアーカイブを取得する必要があります。
取得:1 http://jp.archive.ubuntu.com jaunty/universe scribes 0.3.3.3-4 (dsc) [1602B]
取得:2 http://jp.archive.ubuntu.com jaunty/universe scribes 0.3.3.3-4 (tar) [1196kB]
取得:3 http://jp.archive.ubuntu.com jaunty/universe scribes 0.3.3.3-4 (diff) [6947B]
1205kB を 9s で取得しました (129kB/s)                                          
sh: dpkg-source: not found
展開コマンド 'dpkg-source -x scribes_0.3.3.3-4.dsc' が失敗しました。
'dpkg-dev' パッケージがインストールされていることを確認してください。
E: 子プロセスが失敗しました

こんなエラーが

いわれた通り、'dpkg-dev'をインストールする。

$ sudo apt-get install dpkg-dev

再び実行してみる。

dyna{cupnes}% sudo apt-get source scribes                                   [~]
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
NOTICE: 'scribes' packaging is maintained in the 'Svn' version control system at:
svn://svn.debian.org/python-apps/packages/scribes/trunk/
すでにダウンロードされたファイル 'scribes_0.3.3.3-4.dsc' をスキップします
すでにダウンロードされたファイル 'scribes_0.3.3.3.orig.tar.gz' をスキップします
すでにダウンロードされたファイル 'scribes_0.3.3.3-4.diff.gz' をスキップします
0B のソースアーカイブを取得する必要があります。
gpg: 警告: 構成ファイル「/home/cupnes/.gnupg/gpg.conf」の安全でない所有者
gpg: 2008年07月15日 04時25分46秒 JSTにDSA鍵ID ED75F599で施された署名
gpg: 署名を検査できません: 公開鍵が見つかりません
dpkg-source: extracting scribes in scribes-0.3.3.3
dpkg-source: info: unpacking scribes_0.3.3.3.orig.tar.gz
dpkg-source: info: applying scribes_0.3.3.3-4.diff.gz

今度は公開鍵の問題か・・?

dyna{cupnes}% which scribes                                                 [~]
/usr/bin/scribes

$ file /usr/bin/scribes
/usr/bin/scribes: a python script text executable

そういえば、Pythonはスクリプトだから
これをそのまま見ればいいのか。

行列でWidgetを配置するには


ninix

参考になりそう

gettext.install('ninix') って何?


「常に手前に表示」について


ここによると

state = stayontop (常に手前に)
というように実装されている様子。

ninixのコードをかたっぱしから調べてみると、

sakura.py の1516行目あたりに次のような記述を発見
elif args[2] == 'stayontop':
  self.surface.window_stayontop(True)

また、どうソースコード内の102行目に
self.surface = ninix.surface.Surface(self, self.prefs, debug)
という記述を発見。

surface.py を見てみると
def window_stayontop(self, flag):
  for surface_window in self.window:
    gtk_window = surface_window.window
    gtk_window.set_keep_above(flag)

gtk.Window
gtk.Windowにset_keep_aboveというメソッドがあって、True/Falseで切り替えが可能な様子。

Pythonのコードを読む



その他色々と


emacsのpython-modeについて


透過PNG素材

最終更新:2010年01月21日 00:04