【Python】形態素解析 MeCab を デスクトップアプリ Tkinter で動かしてみる #2

はじめに

今回はGUIデザイン編として、前回作成した MeCab のロジックを少しいじったりしながら TkinterGUI を楽しんでみたいと思います。ただ、私自身 Python 初心者なので初歩的な話から「メモ書き」として進めていきたいと思います。

お品書き

今回扱う内容です。

  1. Python のモジュールとパッケージ
  2. Tkinter による GUI 開発
  3. 実装してみる

1. Python のモジュールとパッケージ

C# では MainWindow を XAML で定義していましたが、Python はロジックで動かすみたいです。要はデザインする画面はないということです。WPF でいう、ロジックだけで画面構成を定義するようなイメージです。

1.1 モジュールとライブラリ

Python にはモジュール・ライブラリ・パッケージ等の用語があり、何がなんだかわかりません。なので、「たくのろじぃのメモ部屋」では変更がない限り、次のように定義します。(定義にしては曖昧...)

用語 意味
モジュール 直接ソースコードから使用できる形で、import できるもの。つまり拡張子が .py になっているもの。あるいは必要機能をまとめた派生クラス。
パッケージ いくつものモジュールを1つの箱としてまとめたもの。つまり1つのディレクト
ライブラリ いくつものパッケージを1つにまとめ、それをインストールできる形にまとめたもの。要はZipファイル的なやつ

モジュールは Using とか include などと同じ感じですね。パッケージは NuGet で ライブラリはプロジェクトファイルそのものとかですかね。

1.2 モジュールから利用する

Python では使用するモジュールを import で読み込みます。利用したいときは as という修飾子をつけるみたいです。これを使うと、名前空間のように扱えます。本来はモジュールに好きな名前をつけられるようなのですが、個人的には C++ でいう std:: 的な言い回しだと思っています。

Pythonオブジェクト指向言語で、クラスとメソッドが存在します。前回の #1 で明確なクラスとメソッドがないと文句を言ってたのですが、あります。ちょっと見えなかっただけでしたが...。例えば時間取得するための構文は

import datetime
today = datetime.datetime.today()
print(today)

となっています。モジュール名.クラス名.メソッド名( ) のようにして呼び出すようになっています。しかし、ライブラリ名から含めて呼び出すと長くなってしまうのと、実装するのが面倒になってくるのでもう少し賢い方法を使います。それが from です。これを使うと、モジュールを省略してクラスとメソッドだけ用いてコーディングすることができます。

from datetime import datetime
today = datetime.today()
print(today)

まとめてみると、from は モジュールの省略 で、as は モジュール名の変更 ですね。で、import は 別の python ファイルを呼び出してクラスとして扱うです。from で指定した名前までは省略していいので、それ以降は記述する必要があります。

2. Tkinter による GUI 開発

TkinterPython でデスクトップ GUI を実装できるツールです。これをインポートして使ってみたのが前回の内容でした。今回はこれを色々いじってみます。

2.1 ウィンドウ

表示するウィンドウについてのパラメータをいろいろいじることができます。

import sys
import tkinter as View

# Tkinter クラスのインスタンス化
MainWindow = View.Tk()
# ウィンドウのタイトル
MainWindow.title("ほげほげ")
# ウィンドウサイズの指定
MainWindow.geometry("700x400")
# ウィンドウの最小サイズの指定
MainWindow.minsize(100,100)
# ウィンドウの最大サイズの指定
MainWindow.maxsize(1000,1000)
# ウィンドウのサイズを固定するか(0 固定, 1 可変)
MainWindow.resizable(1,1)
# ウィンドウ GUI を動かすための処理
MainWindow.mainloop()

2.2 UIコントロール

コントロールというのは WPF の名残です。ラベルやボタンなどのことを指します。例えば、ラベルを宣言するときはこのようにします。

import sys
import tkinter as View
from tkinter import font

# Tkinter クラスのインスタンス化
MainWindow = View.Tk()

# ラベルの作成
Label1 = View.Label(MainWindow, text="テストラベル")
# ラベル内のフォント指定
font1 = font.Font(family="Helvetica", size=20, weight="bold")
# ラベルの座標指定
Label1.place(x=100, y=20)

text の部分は WPF でいう Contents で、実際に文字を表示させたい内容を指定します。
ステータスバーの表示も同じようして宣言します。引数部分に設定値を記述して、それを渡しているイメージで書いていきます。

# 進捗度を表示するステータスバー
Statusbar = View.Label(MainWindow, text="ステータスが表示されます", borderwidth=2, relief="groove")
# バーの表示する位置、fill で X軸いっぱいに広げて表示
Statusbar.pack(side=View.BOTTOM, fill=View.X)

ボタンを宣言するときはこうします。

import tkinter as View
from tkinter import messagebox as MessageBox 

# Tkinter クラスのインスタンス化
MainWindow = View.Tk()

# ボタンを使う
def On_Click():
    # ボタンのクリックイベントハンドラ
    text = "クリックされたよ"
    MessageBox.showinfo("ボタンクリック", text)
# ボタンの引数に command を指定してトリガを設定する
Button1 = View.Button(MainWindow, text="クリック", command=On_Click)
Button1.place(x=200, y=20)

しれっと使っていますが、メッセージを表示させることもできます。Tkinter には messagebox クラスが含まれていますが、私はWPF風にしたかったので大文字にしてみました。
メッセージボックスの宣言で (text="") はダメみたいです。なので、その前に text 変数を宣言してから引数に text を入れます。

ボタンはクリックされたときのトリガを command=処理メソッド の形で指定します。なので、直前にメソッドを作成しておく必要があります。ここは WPF と同じです。

最後にテキストを入力するコントロールを紹介します。

import tkinter as View
from tkinter import messagebox as MessageBox 

# Tkinter クラスのインスタンス化
MainWindow = View.Tk()

# テキストボックス
Textbox1 = View.Entry(width=30)
Textbox1.place(x=200, y=100)

テキストボックスは幅を設定するくらいでも十分に動きます。あとはここに入力された値を get( ) メソッドで受け取れればいいと思います。

3. 実装してみる

以上の内容を使って実装してみます。テキストボックス入力された値をボタンから呼び出す程度のプログラムです。ステータスバーやラベルは飾りだと思ってください。

import sys
import tkinter as View
from tkinter import messagebox as MessageBox 
from tkinter import font

# Tkinter クラスのインスタンス化
MainWindow = View.Tk()

# ウィンドウのタイトル
MainWindow.title("ほげほげ")
# ウィンドウサイズの指定
MainWindow.geometry("700x400")
# ウィンドウの最小サイズの指定
MainWindow.minsize(100,100)
# ウィンドウの最大サイズの指定
MainWindow.maxsize(1000,1000)
# ウィンドウのサイズを固定するか(0 固定, 1 可変)
MainWindow.resizable(1,1)

# ラベルの作成
Label1 = View.Label(MainWindow, text="好きな文字を入力してくださいな")
# ラベル内のフォント指定
font1 = font.Font(family="Helvetica", size=20, weight="bold")
# ラベルの座標指定
#Label1.place(x=50, y=10)
Label1.pack()

# 進捗度を表示するステータスバー
Statusbar = View.Label(MainWindow, text="ステータスが表示されます", borderwidth=2, relief="groove")
# バーの表示する位置、fill で X軸いっぱいに広げて表示
Statusbar.pack(side=View.BOTTOM, fill=View.X)

# ボタンを使う
def On_Click():
    # ボタンのクリックイベントハンドラ
    text = Textbox1.get()
    MessageBox.showinfo("ボタンクリック", text)
    Statusbar.update
# ボタンの引数に command を指定してトリガを設定する
Button1 = View.Button(MainWindow, text="クリック", command=On_Click)
Button1.place(x=400, y=100)

# テキストボックス
Textbox1 = View.Entry(width=30)
Textbox1.place(x=200, y=100)

# ウィンドウ GUI を動かすための処理
MainWindow.mainloop()

実行結果です。

f:id:takunology:20190714132315p:plain

さいごに

Tkinter はちょっと古い GUI ですが、その分だけ資料は豊富です。普通に利用する分には問題ないと思います。あとは Python プログラミングになれる必要があるくらいですね。

これからいっぱい練習します。そして卒研に活かすんだ...

参考にどうぞ

github.com

参考にさせていただいたサイトです。ありがとうございます。 python.keicode.com