PythonでGUIやるならTitaniumがよさそう ~ Twitterクライアント作ってみた

この記事読んで以来、ずっとTitaniumをいじっていました
Ruby,Python,PHP,JavaScriptでマルチプラットフォームなデスクトップアプリを簡単に作成する Appcelerator Titanium Desktop - 仙台 Rails Vim JavaScript社長

Titanium Desktopの何がすごいって、Webkitベースなのでhtml/css/javascriptweb標準技術が使えて、さらにはKrollというライブラリがそれぞれの言語の仲立ちをし、名前空間を共有しそれぞれのライブラリを呼び出せるそうな。なにそれきもい。
僕は完全に が使えるwebkitとしか見てなくて、GUIライブラリが貧弱なPythonだと、十分有力な選択肢に入ると思われます。一度作ったものはクロスブラウザで使えるし。

簡単なTwitterクライアントを作ってみた

あっさりできました。ここにおいてるのは簡易版で、いろいろ機能を追加してる開発板はgithubに置いてます
mizchi's twaan at master - GitHub

ちなみに Titanium固有のAPIは全く使ってません。ファイルアクセスとか、pythonからやればいいじゃない。


要:twitter-python simplejson
python-twitter - Project Hosting on Google Code


tw.py

#encoding:utf-8
import twitter

localStorage.id="your_twitter_username"
localStorage.password="your_password"

tw=twitter.Api(localStorage.id,localStorage.password)
id_last_tl=0 
twul = document.getElementById("twitter")

def update():
    tl = tw.GetFriendsTimeline(count=150,since_id=_id_last_tl)
    for i in tl[::-1]:
        node=document.createElement("li")
        node.innerHTML=u'<img src="%s"/><span>%s</span><span>%s</span>' %(i.user.profile_image_url,i.user.screen_name,i.text)
        twul.insertBefore(node,twul.firstChild)

    global _id_last_tl
    _id_last_tl=tl[0].id

index.html

<!DOCTYPE html>
<html>
  <head>
    <script type="text/python" src="tw.py" />
  </head>
  <body>
     <button onclick="update()">更新</button>
     <ul id="twitter" />
  </body>
</html>


配置はこう

Resources
  - index.html
  - tw.py
  - twitter.py
  - simplejson


行儀がいい書き方かわからないのですが、Pythonから縦横無尽にjsの関数を呼び出してDOMを叩いています。
localStorageの保存先は Macだと /Library/Application\ Support/Titanium/プロジェクト とかどこか。
何ができるかはソースで雰囲気はわかると思います。

利点

  • とにかくPythonでごりごり書けるのが素敵
  • 標準技術の最新仕様でGUIを書ける!
  • ウェブ経由のインストーラを自動的に作ってくれる

欠点

  • 別言語のオブジェクトを参照するときの挙動がいまいちわからない
  • ドキュメントが整理されてない
  • 日本語での情報が極端に少ない

参考:Appcelerator Codestrong - Titanium Desktop APIs


そういえばpythonから canvasのコンテキストをとってこれなかった
次の式で getContextがないと言われる
ctx = document.getElementById('main').getContext('2d')