Python初心者がScikit-imageの例題を自分用に使うためのヒント４GUIを使う


[Python初心者がScikit-imageの例題を自分用に使うためのヒント](http://qiita.com/nonbiri15/items/ae1c51abd65faf27d99f)
[Python初心者がScikit-imageの例題を自分用に使うためのヒント2　複数のファイルを処理する](http://qiita.com/nonbiri15/items/f50857dc555064134db6)
[Python初心者がScikit-imageの例題を自分用に使うためのヒント3　ファイルに書き込む](http://qiita.com/nonbiri15/items/b5b4b1127e12f0abb766)
に続いて、[Scikit-image](http://scikit-image.org/)の例題を、ほんの少しだけ改変して、遊んでみるために、Python初心者向けの内容を書いてみます。

OpenCV-Python、Scikit-imageを使って作ったツールを第3者に使ってもらうためには、コマンドラインのインタフェースや、GUIを使ってツールを起動できるようにすることです。

###**コマンドラインインタフェースを使うために**
[Python初心者のためのOpenCV](http://qiita.com/nonbiri15/items/e54b09f799375a3db49d) をご覧ください。それを参考にしつつダウンロードしたOpenCV一式から
(opencv_2.4のフォルダ)\sources\samples\python2
(opencv_3.1のフォルダ)\sources\samples\python
にあるサンプルのPythonスクリプトをご覧ください。

sys.argvを使っている例題が、コマンドラインインタフェースを使うための見本となります。
> filename = sys.argv[1] 

などが典型的な使い方です。
cygwinなどを使っていたら、>grep sys.argv *.py とかすれば見つけられます。


###**GUIを使うために(Tkの場合)**
アイコンをダブルクリックしたときに、GUIだけで操作できるように作っておくと、Python言語を知らない人に使ってもらいやすくなります。
Python言語は標準の配布の中にTkinterというGUIのライブラリをもっています。これを使うとWindows,Linuxで共通のGUIを実現するのを簡単に記述できます。
GUIを使いたいと思うありがちな状況は、入出力のファイル名を指定するときです。誰かに使ってもらうスクリプトの場合には、GUIでファイル名を入力したいと思うことでしょう。
私がよく用いる使い方の１つは、C/C++言語で作成するツールは、コマンドラインで動作するように作っておいて、そのツールに与えるファイル名をtkFileDialogで
filename=tkFileDialog.askopenfilename(filetypes=fTyp,initialdir=iDir)
のようにして得るというものです。
またメッセージを
tkMessageBox.showinfo('タイトル','表示するメッセージ')
で表示したり、YesNOの質問を
tkMessageBox.askquestion('タイトル','質問の内容')
をする使い方を私はよくしています。
以下に示すものは、私の典型的な使い方の一例です（注）。

![20160116a.png](https://qiita-image-store.s3.amazonaws.com/0/83761/81d59acc-eb5a-b4f3-297b-c36ae42f3877.png)

![20160116.png](https://qiita-image-store.s3.amazonaws.com/0/83761/20873d2e-47e3-c82d-9cb8-59463918c873.png)

![20160116b.png](https://qiita-image-store.s3.amazonaws.com/0/83761/02026320-effa-f227-558c-2f8399301641.png)
Tkinterには、もっと高度なGUIを作成する機能があります。しかし、私はそのような凝ったGUIを作ることなく過ごしています。




```.py:gui_example.py
# -*- coding: cp932 -*-
import sys, os, string, glob
import Tkinter
import tkMessageBox
import tkFileDialog
if __name__=='__main__':
    root=Tkinter.Tk()
    root.withdraw()

    doc=u"""aviファイルを表示するツール
表示する動画ファイル(avi, mp4)を指定してください。
"""
    tkMessageBox.showinfo('aviviewer.py',doc)
    fTyp=[('movie file','*.avi;*.mp4'),]

    filename=tkFileDialog.askopenfilename(filetypes=fTyp,
                                          initialdir='.')
    
    assert(os.path.isfile(filename))
    cmd='''aviViewer.exe "%s"''' % filename
    os.system(cmd)
    doc=u"""aviViewer.pyを終了します。
"""
    tkMessageBox.showinfo('aviViewer.py',doc)
    
```

日本語での記事の一例
####**tkFileDialog**
[[Python]Tkinter(tkFileDialog) を使ってファイルを開くダイアログを使ってみる。](http://d.hatena.ne.jp/Cassiopeia/20070819/1187479725)

####**tkMessageBox**
記事 [Python で Tkinter を使って MessageBox を表示する。](http://d.hatena.ne.jp/Cassiopeia/20070818/1187416973)

###**課題**：
[Python初心者がScikit-imageの例題を自分用に使うためのヒント2　複数のファイルを処理する](http://qiita.com/nonbiri15/items/f50857dc555064134db6)
に示した例題を元に、for name in glob.glob("*.jpg"):の代わりに、tkFileDialog.askopenfilename()を使って、ファイルを与えるように書き換えてみよう。

注：これはあくまで、PythonでGUIを追加するための例題です。OpenCV-Python自体でAVIファイルを読み取り表示することができるので、exe形式のコマンドを実行させる必要がありません。このようにC/C++言語で開発する部分にGUIを含めないことで、OS依存性や商用ライブラリへの依存性を減らすことができます。



###**追記：コマンドラインにオプションを追加したい場合**
Unixのコマンドが-や--で始まるコマンドラインオプションと同等の機能を追加したい場合には
以下の標準ライブラリを使うこともできる。
(ただし私の場合にはあまり使うことがない。)

Python 標準ライブラリ [getopt — C言語スタイルのコマンドラインオプションパーサ](http://docs.python.jp/2/library/getopt.html)

Python 標準ライブラリ [argparse — コマンドラインオプション、引数、サブコマンドのパーサー](http://docs.python.jp/2/library/argparse.html#module-argparse)


[ヒント5　ネットワークアプリに組み込む](http://qiita.com/nonbiri15/items/5fd0c8b789ba9857dbed)