EasyGuiを用いたPythonスクリプトの簡易GUI化

 Pythonスクリプトにグラフィカルインタフェースを実装する場合の選択肢としては、多少煩雑になるのは覚悟の上でTKinterなどのGUIプログラミングキットを用いるのが一般的だろう。ただしこの手法を実践するにはコーディングに関するかなり高度なスキルが求められるため、初心者レベルのPythonプログラマにとっては敷居が高いというのが実状である。こうした面倒なコーディングを経ることなく、Pythonスクリプトへの簡易的なGUI機能の組み込みを可能にしてくれるのが、本稿で紹介する EasyGui というモジュールだ。実際EasyGuiを利用した場合、数行のコードを追加するだけでPythonスクリプトをグラフィカル化できてしまうのである。

 EasyGuiの能力を実感する最善の方法は、これを用いて手元にある既存のPythonスクリプトを改良してみることだ。本稿ではそのためのベースとして、メモ類、URLの控え、行動予定リストなどのパーソナルデータ管理用に私が作成したPygmynoteという簡易管理ツールを使用することにする。オリジナル状態のPygmynoteでもそれほど使い勝手が悪い訳ではないのだが、ここではレコード抽出操作を簡単化するために、いくつかのテキスト入力ボックスとダイアログを追加してみることにしよう。

 スクリプトの改良作業に着手するにあたっては、事前にEasyGuiをインストールしておかなくてはならない。まずは同モジュールの最新リリースをダウンロードし、アーカイブを展開して得られるeasygui.pyファイルを/usr/lib/python2.5/site-packagesディレクトリに移動しておく。そしてこのモジュールを利用するスクリプトについては、その先頭部に「from easygui import *」というインポート行を追加しておかなくてはならない。以上の準備が完了すると、EasyGuiを用いたスクリプトの改造が行えるようになっているはずだ。

 まずは手始めに“Pygmynote is ready. Pile up!”というユーザ歓迎用のメッセージ部を、もう少し見栄えのするメッセージボックスに置き換えてみよう。こうした機能を追加してくれるのがEasyGuiのmsgbox関数であるが、この関数を使用する最低限のパラメータ指定としては、下記のサンプルコードのようにメッセージ表示用のテキストだけを指定しておけばいい。

msgbox("Pygmynote is ready.")

 その他にもこの関数では、メッセージボックスのタイトル、ボタンのラベル(デフォルト値は“OK”)、イメージ表示用の画像という3つのパラメータを指定することができる。例えばメッセージボックスに彩りを加えたければ、最終パラメータを介して適切なgifイメージを表示させればいいはずだ。下記のサンプルコードでは、msgbox関数にて使用可能なすべてのパラメータを指定している。

image = "pygmynote.gif"
msgbox("Pygmynote is ready.", "Pygmynote", ok_button="Pile up!", image=image)

 次に、Pygmynote操作用のコマンド群を扱いやすくするため、使用可能なコマンドを一覧したメニューを表示させてみよう。このメニューを追加した場合のコマンド指定は、リスト上での項目選択後にOKをクリックするか、目的のコマンドを直接ダブルクリックすることにて行えるようになるのだ。こうした処理を可能にしてくれるのがEasyGuiに用意されたchoicebox関数であり、ここでも先のmsgbox関数と同様のパラメータを指定可能だが、この場合に指定すべき内容は、メッセージ用のテキスト、ウィンドウのタイトル、選択項目のリストという3つである。

msg ="What's your favorite fruit?"
title = "Fruity"
choices = ["Apple", "Apricot", "Pineapple"]
choice = choicebox(msg, title, choices)

 このメニューの実装後、リストに一覧された中から目的のコマンドを選択してOKをクリックする(あるいは当該コマンドを直接ダブルクリックする)と、関数の戻り値として選択された項目名が返される。ただし先に述べた用途にこのchoicebox関数を使うには、Pygmynoteというスクリプトにて使用可能なコマンドを一覧したリストを、下記のような形式にてパラメータ指定しなくてはならない。

msg ="Select command and press OK"
title = "Pygmynote"
choices = ["Help", "Insert new record", "Show all records", "Quit"]
command = choicebox(msg, title, choices)

 またその後実行する条件分岐のブロックではcommand=="n"command=="Insert new record"となるなど、choiceboxに渡した項目名とコマンド名とを一致させるための置き換えを施さなくてはならない。その他、このスクリプトを現状のままで実行するとリスト上の項目はアルファベット順でソートされるはずだが、この種の並び順については“Insert new recordは最初の項目にしたい”などの要望が出てくることだろう。実のところEasyGuiはソート順のカスタマイズ機能を実装していないのだが、その単純な回避策としては“1 - Insert new record”や“X - Quit”のように、項目名の先頭に強制ソート用の記号を付けておけばいいはずだ。