Python+OpenCVで画像編集の練習3(Tkinter編)

ユーザー入力をGUIで受け付けられるようにするため、PythonでGUIを組むことのできるツールキットであるTkinterを導入してみる。

Tkinterの導入

AnacondaによってTkinterも一緒にインストールされていたが、最新版に入れ変えてみることにする。そもそもPythonでパッケージをインストールする方法が良くわかっていないためその調査も兼ねる。

まず始めに気になったのはパッケージ管理としてpipを使うべきなのか、それともcondaを使うべきなのかということ。調査の結果、基本的にはcondaを使えば良いらしい。ただcondaにはまだ含まれないパッケージも多数存在するらしく、その場合に限ってpipを使えば良いとのこと。condaのパッケージ関連コマンドは以下。

# パッケージの検索
$ conda search <パッケージ名>

# 特定のチャンネル内に存在するパッケージの検索
$ conda search -c <チャンネル名> <パッケージ名>

# 全てのチャンネル内でパッケージの検索
$ anaconda search -t conda <パッケージ名>

# パッケージのインストール
$ conda install <パッケージ名>

# 特定のチャンネル内に存在するパッケージのインストール
$ conda install -c <チャンネル名> <パッケージ名>

conda search tkinterを実行したところいくつかのチャンネルが表示されたため、condaパッケージとして存在するようだ。別にチャンネルに拘りは無かったためconda install tkinterでチャンネル指定せずインストールした。

Tkinterを使ってみる

処理対象のファイルをGUIで選択できるようにする

Tkinterにかかればこんなことも簡単にできるらしい。以下を参考に実装してみた。

そのまま実装したら問題なく動作した。ただコードの中身を理解していないため少しお勉強。

# モジュールのインポート
import os, tkinter, tkinter.filedialog, tkinter.messagebox

tkinterだけでなくtkinterのサブモジュールもインポートする必要があるらしい。osモジュールはファイル名取得やパス管理で使用する。

# ファイル選択ダイアログの表示
root = tkinter.Tk()
root.withdraw()

1行目でGUIのフレームを作成している。2行目はTkの小さいウィンドウが非表示にするというもので、これは本当に目から鱗だった。というのも先週末にTkinterをちょっとだけ触ってみたところ、メッセージボックスを表示すると離れた場所にTkと描かれた小さいウィンドウが常駐してしまい困り果てていた。結局解決せず投げ出してしまっていたが、こんな対処が可能だったとは。

iDir = os.path.abspath(os.path.dirname(__file__))

os.path.dirnameはディレクトリ名を返す関数でその引数は__file__となっている。この__file__とは何ぞやということで調べたところ、これはコンパイル時に「自身のファイル名」に変換されるCでも使用される組み込みマクロらしい。つまりos.path.dirname(__file__)は自身のファイルが存在するディレクトリ名を返している。続いてos.path.abspathは絶対パスを返す関数で、結局ここでは自身のファイルが存在する絶対パスをiDirに代入していることになる。

tkinter.messagebox.showinfo(‘○×プログラム’,’処理ファイルを選択してください!’)

メッセージボックスの表示。今回はshowinfoを実行しているため!マークのメッセージボックスとなるが、他数種類のマークが指定可能。

file = tkinter.filedialog.askopenfilename(filetypes = fTyp,initialdir = iDir)

tkinter.filedialog.askopenfilenameはファイルダイアログを表示し、選択されたファイルの絶対パスを返す関数。オプションとして以下が使用可能。

initialdir = ディレクトリ
最初に選択されているディレクトリ
initialfile = ファイル
最初に選択されているファイル(出力ファイルのみ有効)
defaultextension = 拡張子
最初に選択されている拡張子
filetypes = パターン
使用可能なファイル種別と拡張子を指定
title = 文字列
ダイアログボックスのタイトル

尚、filetypesはリストとタプルで指定する。

filetypes = [ファイル種別, … ]
ファイル種別 := (名前, (拡張子, …))

今回はファイルタイプと最初に選択されているディレクトリを指定している。iDirには自身のファイルが存在するディレクトリが代入されている。

以上により変数fileに選択したファイルのフルパスが保持される。いくらでも応用できそう。