本日はPythonのGUIアプリケーション開発の標準モジュールTkinter(ティーキンター)について開発実例を交えて紹介します。
Pythonでツールを開発したけど、Pythonの実行環境がない人にも使ってもらいたい!
JavaScript使えないと難しいの?
Tkinterって聞いたことはあるけど何ができるかよく分からない。
本記事ではそんな疑問にお答えします。
簡素なものにはなりますがTkinterを用いることでpythonだけでGUIアプリケーションを開発することが可能です。
最後には実際にTkinterで開発したフォルダ内のPDFファイル名を自動で変換するツールの実例紹介もしていますので、ぜひ参考にしていってください。
それでは順番に詳細を説明していきます!
Python Tkinter を用いたGUIアプリケーション開発手法
Tkinter パッケージ は、標準の Python GUI 開発のインタフェースです。
といっても何ができるかイメージがつかないと思われますので、実際に以下をコマンドライン上で実行してみてください。
簡素なTkinterを用いたGUIアプリケーションの例が立ち上がります。
python -m tkinter
”Click me!”を押すと[]が増えていくのが確認できましたか??(笑)
何も意味ないアプリじゃん!と思われるかもしれませんが、実際にこのGUIの裏側にはPythonコードが走っていて、Tkinter上のClickやQuitを条件に動作させることができます。
今のご時世こんなアプリケーションよりもWebアプリケーションが主流だろ!と思われるかもしれませんが、まずは自分のコードをアプリケーションに落とし込む達成感と基礎を学ぶ上ではTkinterはおススメです!
プログラミングしたものが実際にアプリケーションとして動くと感動するよね!
Tkinterのメリット/デメリット
それでは具体的なTkinterの使用方法を見ていく前にtkinterのメリット/デメリットを見ていきましょう!
メリット
- Pythonに標準で付属しているのでモジュールのインストールが不要
- Pythonの言語だけでGUIアプリケーションの開発が可能
- シンプルな文法で開発が比較的容易
- Windows、Mac OSX、Linux すべての環境下で対応可能
デメリット
- 見た目がちょっとダサい。 (Tkinterの拡張モジュールttkを導入すれば多少はマシ!?)
- シンプルな機能のみに限られる。
- スクリプト言語 Tcl/Tk(ティクル・ティーケー)でモジュールが開発されているため、モジュール自体をいじることは難しい。
上記デメリットを考慮してもPython言語だけでGUIアプリケーションを比較的簡単に開発できる強みがあります。
Tkinterでは最終的に.exe化することでPythonとか使えない!という方にも開発したアプリケーションを使用してもらうことができます。
ちょっとした便利ツールなどの共有にはもってこいですね!
見た目も大事だけど一番大事なのは機能だよね!!
TkinterでのGUI開発ステップ
Tkinterを用いてフォルダ内のPDFファイル名を自動で変換するツールを開発します。
本ツールを用いることでフォルダに保存しているPDFファイルの名称を一つ一つ変更せずともcsv上に記載したファイル名に一括で更新できます。
実装する機能は以下です。
Tkinterにて実装する機能
- フォルダのパスをTkinter GUI上に入力し、指定したフォルダーに保存してあるPDFファイルの名称を読み込む。
- csvファイルのパスをTkinter GUI上に入力し、指定のフォルダーに保存してあるcsvファイルに記載した変更したい名称を読み込む。
- Tkinterのボタン押下で実際のファイル名変更の前に確認動作を行えるようにする (csvファイル上で元ファイル名と変更名が一対一対応していることを確認する)。
- 確認の後、Tkinterのボタンからファイル名の置換を実行する。
上記開発に必要なTkinterのPythonプログラミングをステップごとに記載していきます。
メインウィンドウの作成 tkinter.Tk()
まずはGUIのメインウィンドウを作成します。
import tkinterでtkinterモジュールを導入します。
root.mainloop()を記載しないとすぐにGUIウィンドウが閉じてしまうので、開発コードの最後には必ず入れるようにしましょう。
import tkinter
root = tkinter.Tk()
#GUIタイトル
root.title(u"PDFファイル名変更")
#GUIウィンドウサイズ
root.geometry("600x260")
root.mainloop()
ラベルの作成 tkinter.Label()
次に文字を記載するラベルをtkinter.label()メソッドで作成します。
今回はlabelでユーザーへの指示を記載します。Static.placeでラベル位置をGUIウィンドウ上のどこにするかを指定できます。
今回は3つラベルを設置しますが、最後のラベルはボタン動作時に文字を表示場所とするため、初期入力ではブランクとしています。
import tkinter
root = tkinter.Tk()
#GUIタイトル
root.title(u"PDFファイル名変更")
#GUIウィンドウサイズ
root.geometry("600x260")
# ラベル_1
Static1 = tkinter.Label(text=u'名称を変更したいpdfファイルの保存先を入力してください。', font=('メイリオ', '9')) # fontでフォント指定
Static1.pack()
Static1.place(x=10, y=10)# ラベル位置指定
# ラベル_2
Static2 = tkinter.Label(text=u'変更ファイル名の記載されたcsvファイルの保存先を入力してください。', font=('メイリオ', '9'))
Static2.pack()
Static2.place(x=10, y=70)
# ラベル_3 動作表示用(初期はブランク)
Static5 = tkinter.Label(text=u'', font=('メイリオ', '13'))
Static5.pack()
Static5.place(x=230, y=200)
root.mainloop()
情報の入力ウィンドウの作成 tkinter.Entry()
次に文字の入力ウィンドウをtkinter.Entry()メソッドで作成します。
label同様に設置位置を指定します。
入力された入力項目は.get()メソッドで入手ができます。
import tkinter
root = tkinter.Tk()
#GUIタイトル
root.title(u"PDFファイル名変更")
#GUIウィンドウサイズ
root.geometry("600x260")
# ラベル_1
Static1 = tkinter.Label(text=u'名称を変更したいpdfファイルの保存先を入力してください。',
font=('メイリオ', '9'))
Static1.pack()
Static1.place(x=10, y=10)
# ラベル_2
Static2 = tkinter.Label(text=u'変更ファイル名の記載されたcsvファイルの保存先を入力してください。', font=('メイリオ', '9'))# fontでフォント指定
Static1.pack()
Static2.pack()
Static2.place(x=10, y=70)# ラベル位置指定
# ラベル_3 動作表示用(初期はブランク)
Static5 = tkinter.Label(text=u'', font=('メイリオ', '13'))
Static5.pack()
Static5.place(x=230, y=200)
# エントリー_1
EditBox1 = tkinter.Entry(width=60)#widthで幅指定
EditBox1.pack()
EditBox1.place(x=10, y=40)
# エントリー_2
EditBox2 = tkinter.Entry(width=60)
EditBox2.pack()
EditBox2.place(x=10, y=100)
root.mainloop()
ボタンの作成 tkinter.Button()
最後に動作を実行するためのボタンをtkinter.Button()メソッドで作成します。
ボタン押下時の動作はbind()メソッドで実装できます。
以下のコードではボタン押下時のアクションを定義していないため、コメントアウトしています。
import tkinter
root = tkinter.Tk()
#GUIタイトル
root.title(u"PDFファイル名変更")
#GUIウィンドウサイズ
root.geometry("600x260")
# ラベル_1
Static1 = tkinter.Label(text=u'名称を変更したいpdfファイルの保存先を入力してください。',
font=('メイリオ', '9'))
Static1.pack()
Static1.place(x=10, y=10)
# ラベル_2
Static2 = tkinter.Label(text=u'変更ファイル名の記載されたcsvファイルの保存先を入力してください。', font=('メイリオ', '9'))# fontでフォント指定
Static1.pack()
Static2.pack()
Static2.place(x=10, y=70)# ラベル位置指定
# ラベル_3 動作表示用(初期はブランク)
Static5 = tkinter.Label(text=u'', font=('メイリオ', '13'))
Static5.pack()
Static5.place(x=230, y=200)
# エントリー_1
EditBox1 = tkinter.Entry(width=60)#widthで幅指定
EditBox1.pack()
EditBox1.place(x=10, y=40)
# エントリー_2
EditBox2 = tkinter.Entry(width=60)
EditBox2.pack()
EditBox2.place(x=10, y=100)
# ボタン_1
Button1 = tkinter.Button(text=u'確認', width=10)#ボタンに記載するテキストを記載
#Button1.bind("<Button-1>", confirm) ボタン押下時のアクションを記載()
Button1.pack()
Button1.place(x=10, y=140)
# ボタン_2
Button2 = tkinter.Button(text=u'実行', width=10)
#Button2.bind("<Button-1>", change) ボタン押下時のアクションを記載()
Button2.pack()
Button2.place(x=10, y=170)
root.mainloop()
思ったより簡単にGUIが設定できた!!
GUIアプリケーションの動作確認 コード全体
それでは上記のGUIに機能を追加していきましょう。
詳細の説明は省きますが二つの関数confirmとchangeを定義し、要求されるフォルダーからのファイルの読み込み、ファイル名称の置換を行っています。
定義した関数のアクションを上記で設置したボタンのアクションに指定しているので、【確認】を押すとconfirmの関数、【実行】を押すとchangeの関数が走ります。
import pandas as pd
import tkinter
import glob, os
from natsort import natsorted
def confirm(self):
path = EditBox1.get()
path_change = EditBox2.get()
tag = ".pdf"
Org_Filenames = []
for f in natsorted(glob.glob(path + "\*" + tag)):
Org_Filenames = Org_Filenames + [os.path.split(f)[1]]
Org_Filenames = [s.replace('.pdf', '') for s in Org_Filenames]
csv_file = pd.read_csv(path_change)
df = pd.DataFrame(data=csv_file)
Change_Filenames = []
for row in df.iloc[:, 0]:
Change_Filenames.append(row)
c1 = pd.Series(Change_Filenames)
c2 = pd.Series(Org_Filenames)
Rename = pd.DataFrame({"change": c1, "orginal": c2})
Rename.to_csv(path_change, header=True, index=False)
Static5["text"] = "CSVを確認ください。"
def change(self):
path = EditBox1.get()
path_change = EditBox2.get()
tag = ".pdf"
csv_file = pd.read_csv(path_change)
df = pd.DataFrame(data=csv_file)
Change_Filenames = []
for row in df.iloc[:, 0]:
Change_Filenames.append(row)
for i, filename in enumerate(natsorted(glob.glob(path + "\*" + tag))):
os.rename(filename, os.path.join(path, Change_Filenames[i] + tag))
Static5["text"] = "名称は変更されました。"
# ----------------------------------------------------------------------------------------
# GUI by tkinter
# ----------------------------------------------------------------------------------------
# Window Size
root = tkinter.Tk()
root.title(u"PDFファイル名変更")
root.geometry("600x260")
# ラベル
Static1 = tkinter.Label(text=u'名称を変更したいpdfファイルの保存先を入力してください。',
font=('メイリオ', '9'))
Static1.pack()
Static1.place(x=10, y=10)
# エントリー
EditBox1 = tkinter.Entry(width=60)
EditBox1.pack()
EditBox1.place(x=10, y=40)
# ラベル
Static2 = tkinter.Label(text=u'変更ファイル名の記載されたcsvファイルの保存先を入力してください。', font=('メイリオ', '9'))
Static2.pack()
Static2.place(x=10, y=70)
# エントリー
EditBox2 = tkinter.Entry(width=60)
EditBox2.pack()
EditBox2.place(x=10, y=100)
# ボタン
Button1 = tkinter.Button(text=u'確認', width=10)
Button1.bind("<Button-1>", confirm)
Button1.pack()
Button1.place(x=10, y=140)
# ボタン
Button2 = tkinter.Button(text=u'実行', width=10)
Button2.bind("<Button-1>", change)
Button2.pack()
Button2.place(x=10, y=170)
# ラベル
Static5 = tkinter.Label(text=u'', font=('メイリオ', '13'))
Static5.pack()
Static5.place(x=230, y=200)
root.mainloop()
【確認】ボタン押下時のアクション
初めにcsvファイルに変更したいファイルの名称を記載します。
GUI上で名前を変更したいファイルの保存パスおよびcsvファイルの保存パスを指定、確認ボタンを押すとcsv上にフォルダ内のもともとの名称が記載されます。
*csvファイルへのパスはファイルまで指定してください。
【確認】ボタン押下後、csvファイル上で比較し、変更名称先に間違いがないことを確認してください。
【実行】ボタン押下時のアクション
【実行】ボタン押下後、PDFファイルが指定のフォルダ名称に変更されていることを確認してください。
まとめ
今回はTkinterを用いたGUIアプリケーションの基礎を実際の開発例を踏まえ紹介しました。
Tkinterで開発したアプリケーションは.exeファイルに変換し、誰でも使えるようにすることができます。
小規模グループで開発したアプリケーションを使いまわすにはTkinterはもってこいかと思います。
本記事を参考にぜひご自身でも開発を行ってみてください。
本日は以上でした!
↓ アプリケーション開発のためのPython習得にもってこいな学習プラットフォームを以下で紹介しています。もしご興味あればこちらもぜひ参考ください! ↓