2010年12月31日金曜日

pyGTKでfullscreenするには

答えとしてはgtk_window_fullscreen()とgtk_window_unfullscreen()を使う。これだけで、ウィンドウがフルスクリーンになるので、あとはhide()でいらないコンテンツを隠すだけで良い。 フルスクリーン状態の判定はwindow_state_eventを使えとあるが、邪魔くさいのでself.fullscreenedというフラグを作って判定に使っている。果たしてこれでいいのかは不明。。。
def set_fullscreen(self, widget):
    if self.fullscreened:
        self.mainWindow.unfullscreen()
        self.toolbar.show()
        self.seekBar.show()
        self.stream.show()
        self.fullscreened = False
    else:
        self.mainWindow.fullscreen()
        self.toolbar.hide()
        self.seekBar.hide()
        self.stream.hide()
        self.fullscreened = True

GladeでDialogにRESPONSE_IDを設定する。

GladeでGUIを作り、その応答を得る場合はgtk_builder_connect_signalsなどを用いて関数に繋げる。しかし、Dialog程度に関数を発行していると大変なことになる。

そんなときはresponce_idをセットすればよい。Gladeでは右ペインの全般タブに応答IDの項目がそれに当たる。


 後はgtk_windowをrun()すればresponce_idが返される。これでresponce_idにより、値を得るかどうかの分岐が簡単にできる。
self.wTree = gtk.Builder() 
self.wTree.connect("gtk_widget_hide", gtk_widget_hide)
 
dialog = self.wTree.get_object("DialogName")
response = dialog.run()
if response == 0:
        print self.wTree.get_object("entry")
elif response == 1:
        print "False"
 
def gtk_widget_hide(widget):
widget.hide() 
あと、Dialogとメインのウィンドウを同じgladefileに保存している場合、destroy()してしまうと、再び呼び出したときに崩れてしまうので、Dialogの×はdestroy()ではなく、hide()に関連付けておいたほうがいい。

2010年12月19日日曜日

pythonのSQLiteでUTF-8を使う

pythonのsqlite3は標準でTEXTがunicodeを要求するようです。何も考えずにUTF-8を投げたらエラーを食らいました。

sqlite3.ProgrammingError: You must not use 8-bit bytestrings unless you use a text_factory that can interpret 8-bit bytestrings (like text_factory = str). It is highly recommended that you instead just switch your application to Unicode strings.

SQLiteでUTF-8を用いたい場合はtext_factoryにstrを指定して解決しました。
import sqlite3
db = sqlite3.connect(":memory:")
db.text_factory = str

Mouseover dictionaryのSQLiteファイルをpythonで作成した。

Mouseover dictionaryの辞書登録をPythonを用いて直接行ってみました。流れとしてはCSVファイル(PDIC)を読み込んでSQLiteのDBを作成し、Firefoxのフォルダに放り込んだだけです。rubyでやっておられる方がいたので真似してpythonの勉強がてらやってみました。
  1. PDICでCSV形式の辞書ファイルを作成
  2. エンコードをUTF-8に変換
  3. 下記のプログラムでSQLiteのDBを作成
  4. /.mozilla/firefox/default.*/に出来たmoseoverdictionary.sqliteを入れる。
こんな流れで適用しました。PDICを使ってしまっているので邪魔くさいだけのような気がしますが、趣味なので仕方ありません。

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

import sqlite3
import csv

def mkMouseOverDicSqlite(filename):
    db = sqlite3.connect("mouseoverdictionary.sqlite")
    # UTF-8で記述したいのでSQLiteの文字コードを指定
    db.text_factory = str
    # テーブルを作成する
    try:
        db.execute('create table dict(key TEXT PRIMARY KEY, desc TEXT)')
    except:pass
    sql = "insert into dict values (?, ?)"
    # csvファイルをパースする。
    reader = csv.reader(file(filename, "rb"))
    reader.next()    # 先頭はラベルなので飛ばす
    for row in reader:
        # Windowsの改行コード\r\nを\に変換する
        try:
            row = map(lambda x: x.replace("\r\n", "\\ "), row)
        except IndexError:pass
        except:raise
        # sqliteDBにデータを入力
        try:    # 新規のデータを入力
            if len(row[2]) != 0:
                db.execute(sql, (row[0], row[2]+"\\ "+row[1]))
            else:
                db.execute(sql, (row[0], row[1]))
        except sqlite3.IntegrityError:    # kyeが存在するので上書きする
            if len(row[2]) !=0:
                db.execute("update dict set desc=? where key =?", (row[2]+"\\ "+row[1], row[0]))
            else:
                db.execute("update dict set desc=? where key =?", (row[1], row[0]))
        except IndexError:pass    # 空のListが読み出された時の処理
        except:raise
    db.commit()    # データベースに保存する。
    db.close()

if __name__ == '__main__':
    myFiles = ["ryaku-116.csv", "reiji-116.csv", "waei-116.csv", "eiji-116.csv"]
    for filename in myFiles:
        print filename+"をデータベースに登録します。"
        mkMouseOverDicSqlite(filename)