Ubuntu Weekly Recipe

第193回Quiclkyで簡単にGUIアプリケーションを作る

少し遡ること9月26日、アプリケーション開発者向けのサイト"Ubuntu App Developerサイト"が正式公開されました。これはUbuntuでアプリケーションやゲームを開発し、さらにはSoftware Centerでそれを公開したいと考えるユーザー向けに、ツールキットやUbuntu特有のプロセスに関する情報を提供するサイトです[1]⁠。

今回はUbuntu App Develperサイトでアプリケーション開発ツールの一つとして紹介されている「Quickly」を使って、簡単なGUIアプリケーションを作ってみます。

Quicklyの使い方

Quicklyとは

Quicklyとは、Pythonベースのアプリケーションテンプレートと、そのテンプレートを元に効率的に開発するためのツールです。コマンドをいくつか入力するだけで、簡単にGUIアプリケーションのひな形の作成からLaunchpadでのプロジェクト公開までを「素早く」行えます。

百聞は一見に如かずということで、まずはQuicklyをインストールしてアプリケーションを作ってみましょう。端末を開いて以下のコマンドを入力してください[2]⁠。最後のコマンドについては、後ほど説明します。

$ sudo apt-get update
$ sudo apt-get install quickly
$ quickly create ubuntu-application uwr-sample

これだけで、uwr-sampleディレクトリ以下に必要なソースコードやリソースが展開されて、一通り必要なUIが実装されたアプリケーションが起動されます。

図1 ひな形を起動したところ
図1 ひな形を起動したところ

Quicklyの中身はただのPythonスクリプトであり、一度ひな形を作ったあとの作業は以下の各種コンポーネントを組み合わせて開発していくことになります。

そのため、アプリケーション開発には、PythonとGTK+に関する基本的な知識が必要です。ただし、図1のように最初の段階で必要最低限「動くもの」が自動生成されますので、あとはトライアンドエラーを繰り返しながら実装を行うといった、Python/GTKを使ったGUIアプリケーションの学習にも使えます。

なお、Quicklyが生成するアプリケーションは、PyGTK/Glade2を使います。このため、GTK+2.xベースになってしまうことに注意してください。Ubuntu 11.10では本格的にGTK+3への移行が進んでいますので、Quicklyも12.04ではPyGI/Glade3に対応したGTK+3ベースのアプリケーションを開発できるようになる予定です

Quicklyコマンドについて

先ほど実行したコマンドについて説明します。以下は、アプリケーションの「最初のひな形」を作成するためのコマンドです。

$ quickly create ubuntu-application uwr-sample

"ubuntu-application"はテンプレート名で、"uwr-sample"はアプリケーション名です。テンプレートには以下のようなものを指定できます。

  • ubuntu-application
    • 一般的なGUIアプリケーションを作るときに使用します。ステータスバー付きのメインウィンドウにメニューバー、簡易的な設定ダイアログとAboutダイアログ、それにヘルプウィンドウが生成されます図2⁠。
  • ubuntu-cli
    • コンソールアプリケーションを作るときに使用します。テンプレートの中では一番シンプルなコードが生成されますので、簡単なPythonツールを作ってPyPIなどで公開したいときにも便利です。
  • ubuntu-pygame
    • pygameを使ったゲームを作るときに使用します。作成した段階で、簡単なシューティングゲームが動きます図3⁠。
  • ubuntu-flash-game
    • Flashを使ったゲームアプリを作るときに使用します。このテンプレートだけは他と異なり、アプリケーション名の後ろにゲーム本体にしたいSWFファイルを指定する必要があります。

アプリケーションは任意の名前を指定できます。ただし、既存のPythonモジュール名と被るような名前をつけると、モジュールインポート時にバッティングがおきて動作しないことがありますので注意してください。

図2 ubuntu-applicationのメニューと設定ダイアログ
図2 ubuntu-applicationのメニューと設定ダイアログ
図3 謎のシューティングゲーム
図3 謎のシューティングゲーム

createコマンドによりアプリケーションの作成が成功すると、以降生成されたディレクトリの中で以下のようなコマンドを実行できます。

  • quickly tutorial:ヘルプウィンドウを表示します。
  • quickly run:アプリケーションを実行します。
  • quickly edit:編集対象となるファイルをエディターで開きます。
  • quickly design:GUI設計ツールであるGladeを起動します。
  • quickly debug:デバッガであるWinpdbを起動し、アプリケーションを実行します。
  • quickly test:testsディレクトリにあるテストスクリプトを実行します。
  • qucikly save "comments":変更したファイルをbzrコマンドでコミットします。
  • quickly package:debファイルを生成します。
  • quickly release:Launchpadプロジェクトを作成し、データをプッシュします。

テンプレートごとに使えるコマンドリストは"quickly commands"で表示できます。より詳しいことや上記以外のコマンドについては、"quickly help コマンド"を参照してください。

アプリケーションの修正

実際にアプリケーションの処理を変更する手順を見ていきましょう。

ソースコードの編集

"quickly edit"コマンドを実行すると、編集対象となるファイルを指定されたエディターで開きます。QUICKLY_EDITOR/EDITOR/SELECTED_EDITORといった環境変数が設定されている場合はそれをエディターとして使います。いずれも設定されていない場合はgedit(Xが起動していない環境ならnano)を使用します。

開かれるのはアプリケーションディレクトリ以下にあるすべてのファイルではなく、アプリケーション開発者が頻繁に編集する可能性が高いものだけです。初期状態だと以下のようなファイルが開かれます。

  • __init__.py: アプリケーション起動後に最初に呼び出されるスクリプトです。オプション解析や設定値の初期化のコードをここに記述しています。
  • *AppliName*.py: メインウィンドウは「AppliNameWidow.py⁠⁠、Aboutダイアログは「AboutAppliNameDialog.py」といったように、各種GUIツールのハンドラを記述するコードは「名前+アプリ名+ウィジェット名」といった命名規則で生成されます。
  • test_*.py: testsディレクトリにあるテストスクリプトです。
  • *.page: Mallard形式のヘルプファイルです。
  • 例えば、アプリケーション起動時にログを残したい場合、__init__.pyに以下のような4行を追加します。

        parse_options()
    
        # logging version
        import logging
        logger = logging.getLogger('uwr_sample')
        logger.debug("Start application...")
    
        # preferences

    debugレベルのログは-vオプションをつけたときのみ表示されるため、アプリケーションに-vオプションを渡すには以下のようにrunコマンドを実行してください。

    $ quickly run -- -v

    コミット

    修正した内容が問題ない場合、それをバージョン管理システムにコミットします。Quicklyでは、以下のコマンドを実行するとアプリケーション作成時に一緒に生成したBazaarリポジトリにコミットできます。そのため、Bazaarコマンドと併用して作業を行うと良いでしょう。

    # コミットログに残す名前の設定(bzrインストール後一度だけ行えば良い)
    $ bzr whoami "Mitsuya Shibata 
    " $ bzr status # 修正されたファイルの一覧を表示 $ bzr cdiff # 差分を色付きで表示 $ quickly save "add startup debug log" $ bzr log # コミットログの確認

    ただし、saveコマンドは引数なしで"bzr add"を実行するため、余計なファイルがリポジトリに追加されてしまうことがあります。本格的にソースコードを編集するようになったら、saveコマンドではなく"bzr commit"を使った方が良いでしょう。

    GUIでBazaarを使いたい場合はbzr-explorerパッケージや、geditならgedit-developer-pluginsパッケージに含まれるBazaar拡張を使うと便利です。なお、残念ながらQuicklyはBazaar以外のバージョン管理システムをサポートしていません。他のバージョン管理システムを使いたい場合は、Bazaarに依存しているコマンドであるsave/package/share/releaseあたりを使用しないよう注意してください。

    GUIの変更

    "quickly design"を実行するとGUI設計ツールであるGladeが起動します。GUIアプリケーション作成時は、GladeでUIの部品(ウィジェット)を配置し、適切な名前をつけ、ソースコード上で各ウィジェットに対する動作(ハンドラ)を設定するという手順になります。Quicklyでは一通りウィジェットとハンドラができあがった状態になっていますので、まずはこれを少しずつ改変しながら開発に慣れていくと良いでしょう。

    例えばメニューの「Edit - 切り取り/コピー/貼り付け/削除」は使わないことにして、削除してみましょう。Gladeが起動したら"UwrSampleWindow.ui"タブを開いて、中に表示されるウィンドウの"Edit"を選択します。さらに"Edit"をクリックするとメニューが展開されるので、⁠切り取り」を選択してください。すると画面右のウィジェットツリーで"mnu_cut"が選択された状態になります図4⁠。あとはこれを右クリックして削除するだけで完了です。

    図4 Gladeで「切り取り」メニューを選択
    図4 Gladeで「切り取り」メニューを選択

    Gladeで保存した上で、"quickly run"を実行してください。Editメニューから「切り取り」がなくなっていることがわかると思います。同様に"mnu_copy"/"mnu_paste"/"mnu_delete"も削除します。あとついでにセパレーターである"separatormenuitem2"も削除します。これでEditメニューは「設定」だけになりました。

    最後に忘れずに"quickly save"で保存します。

    パッケージングとリリース

    一通りソースコードの編集が終わったら、リリースを行います。Quicklyにおけるリリースとは、⁠Launchpadに作成済みの自分のプロジェクトサイトのPPAでパッケージを公開する」作業を指します。具体的には、"quickly release"コマンドを実行することで、以下のステップが自動で実行されます。

    1. 設定していない場合は、Launchpad上のプロジェクト名を入力する
    2. Launchpadからプロジェクトページの情報を取得する
    3. Launchpadから自分のアカウント情報を取得し、setup.pyのauthorとauthor_emailを更新する
    4. bzrのログからバージョン番号を決定し、リリースタグを設定した上でコミットする
    5. ソースコードをlp:~user_name/project_name/quickly_trunkにpushする
    6. ソースパッケージを作成し、プロジェクトPPAにアップロードする
    7. Launcpadのプロジェクトページを更新する

    いずれも、LaunchpadとBazaarに強く依存した作業になっており、Launchpad上にあらかじめアカウントを作成し、PPAでパッケージを公開するためにGPG鍵を登録し、プロジェクトページを作っておく必要があります。これらの設定はすべてブラウザから行えます。詳しいことは、LaunchpadのHelpページを確認してください。

    releaseコマンドの実行例として、今回の作業の結果を以下のページに公開しています。

    プロジェクトページではマイルストーンが設定されていること、コードページではユーザーページのBazaarブランチが登録されていること、そしてユーザーのPPAページで該当パッケージがビルドされていることが確認できます。

    もしLaunchpadの操作に不慣れな場合は、staging領域を使うと良いでしょう。これは、Launchpad全体をコピーしたテスト用のサイトで、定期的に本家と同じ状態になるようデータのリセットが行われています。つまり、ここで行った操作は本家には反映されませんので自由にテストすることができるのです。quiclyには"--staging"というオプションがあり、これをつけてreleaseコマンドを使うと"launchpad.net"ではなく"staging.launchpad.net"が使われます。

    Launchpad自体を使わずにDebianパッケージだけを作りたいのであれば、"quickly package"コマンドを使うことでローカルにdebファイルが生成されます。ただしバージョン名や作者名はLaunchpadから取得できないため、自分でsetup.pyをあらかじめ更新しておく必要があります。

    また、Quicklyで作成したアプリケーションはgettextによる国際化にも対応しています。release/packageコマンドを実行するとpoディレクトリとpotファイルが作成されます.それをja.poにリネームした上で翻訳しbzr addすると、次回release/packageの際に翻訳済みのリソース(moファイル)が生成・インストールされるようになります。

    まとめ

    簡単にですが、Quicklyの使い方について説明しました。GUIアプリケーションの開発における最初のハードルは「とりあえず動くもの」を用意することですが、Quicklyはそれを簡単に実現してくれますので、プロトタイプを作成するにはもってこいのツールです。

    Quicklyで作ったアプリケーションは国際化に対応している上に、テストやデバッグのためのコマンドもあります。ただしPyGI/GTK+3に対応していない、テンプレートの数が少ないといった問題点も多く、Quicklyだけで開発のすべてをカバーできるという状況にはなっていません。現時点では、あくまでUbuntuでアプリケーションを作るときの基本的な作法を学べる、ぐらいに思っておくと良いでしょう。

    Ubuntu App Developerサイトでは、Quicklyを使った具体的な手順を動画として公開していますのでこちらも参考にしてください。

  • 動画:http://developer.ubuntu.com/get-started/
  • 上記動画の台詞を文章にしたもの:http://developer.ubuntu.com/wp-content/themes/wordpress-theme-ubuntudeveloper/transcript-quickly-tutorial.txt
  • さらにUbuntuコミュニティでは半年に一度のペースで、UbuntuAppDeveloperWeekというアプリケーション開発者向けのチュートリアルイベントを開催しています。先月行われたイベントでもQuicklyを紹介していますので、今後は数多くのアプリケーションがQuicklyで開発されるかもしれません。

    おすすめ記事

    記事・ニュース一覧