【業務自動化】Chapter2-5:ツールにダイアログウィンドウを追加しよう

一つ前のページでは ツールにエラー処理を追加 しました。
今回は ダイアログウィンドウ を追加しましょう。
Chapter1:PythonでExcelを操作しよう
Chapter2:PyInstallerで自動化ツールを(.exe)作ろう
・Chapter2-1:Pythonスクリプトを実行ファイルに変換しよう
・Chapter2-2:表記ゆれを一瞬で直す置換マシンを作ろう
・Chapter2-3:置換の対象ファイルを増やそう
・Chapter2-4:エラー処理を追加しよう
・Chapter2-5:ダイアログウィンドウを追加しよう ◁今回はここ
Chapter3:便利な自動化ツールを5つ作ろう
Chapter4:Webスクレイピング入門
Chapter5:自動化ツールを作って稼ごう
これまでの自動化ツールは、コンソール(黒い画面)で動作していました。
しかしPythonには Tkinter(ティーキンター) という標準ライブラリを使って、マウスで操作できる「ダイアログウィンドウ」や「ボタン」を表示する方法があります。
この記事では、これまでに作成した「表記ゆれ一斉置換ツール」にTkinterを使った GUI(グラフィカル・ユーザー・インターフェース)を追加し、より使いやすいツールに進化させることを目標とします。
Tkinterとは|Python標準GUIの基礎とできること
Pythonで業務自動化を進めていくと、「スクリプトを実行するたびにコマンドラインを開くのは少し面倒だな」と感じたり、「プログラミングに詳しくない人でも使えるようにしたい」と思うことがあります。
そんなときに役立つのが Tkinter(ティーキンター) です。
TkinterはPythonに標準で搭載されているGUI(Graphical User Interface)ライブラリで、追加のインストールをしなくてもすぐに利用できます。

これを使えば、ボタンや入力欄、ファイルを選ぶダイアログなどを簡単に作成でき、業務自動化スクリプトを「誰でも扱えるアプリ」に進化させることができます。
コマンド入力に慣れていない人でも、GUIのボタンをクリックするだけで処理を実行できるようになるのです。


Tkinterの概要とできることの具体例
Tkinterを使うと、以下のような操作を簡単に実現できます。
- Excelファイルを選ぶファイルダイアログを表示する
- 処理の進行や結果をメッセージボックスで通知する
- ボタンをクリックしてスクリプトを実行する
- 入力フォームから条件を指定して自動化処理を動かす
このように、業務自動化でよくある「ファイル選択」「実行ボタン」「確認メッセージ」などは、ほとんどTkinterだけで対応可能です。
たとえば「Excelファイルを選んで、そのパスを表示する簡単なGUIアプリ」のコードを見てみましょう。
以下のコードをコピーし、実行してみて下さい。
# Tkinter本体と、ダイアログやメッセージ表示に使うモジュールを読み込む
import tkinter
from tkinter import filedialog, messagebox
# ファイル選択処理を行う関数
def select_file():
# Excelファイルを対象にしたダイアログを開く
filepath = filedialog.askopenfilename(
filetypes=[("Excel files", "*.xlsx;*.xlsm")]
)
if filepath: # ファイルが選ばれた場合のみ処理を実行
messagebox.showinfo("選択されたファイル", filepath)
# メインウィンドウを作成
root = tkinter.Tk() # Tk()クラスをインスタンス生成
root.title("ファイル選択サンプル") # ウィンドウのタイトルを設定
root.geometry("300x150") # ウィンドウのサイズ(幅×高さ)を指定
# メインウィンドウ内にボタンを作成
button = tkinter.Button(root, text="Excelファイルを選ぶ", command=select_file)
button.pack(pady=40) # packでボタンを配置。padyは上下の余白。
# イベントループを開始
root.mainloop()このサンプルでは「Excelファイルを選ぶ」ボタンをクリックすると、ファイル選択ダイアログが開き、選んだファイルのパスがポップアップで表示されます。
openpyxlと組み合わせれば、そのファイルを読み込んで自動処理する仕組みが簡単に作れるようになります。
代表的なTkinterウィジェットと関数一覧
Tkinterには多くの機能がありますが、まずは以下を覚えておくと実用的なGUIを作れるようになります。
| 関数・部品名 | 主な引数・オプション | 説明 |
|---|---|---|
Tk()クラス | (引数なしで使うのが基本) | メインウィンドウを生成する |
Labelクラス | Label(parent, text="表示文字列") | テキストを表示するラベルを作成する |
Buttonクラス | Button(parent, text="ボタン名", command=関数名) | ボタンを作成し、クリック時の処理を指定できる |
Entryクラス | Entry(parent, width=文字数) | 1行の入力欄を作成する |
filedialog.askopenfilename()関数 | filetypes=[("名前", "*.拡張子")] | ファイル選択ダイアログを開く(表示する拡張子を指定できる) |
messagebox.showinfo()関数 | messagebox.showinfo("タイトル", "メッセージ") | 情報メッセージを表示する |
messagebox.showerror()関数 | messagebox.showerror("タイトル", "エラーメッセージ") | エラーメッセージを表示する |
mainloop()関数 | (引数なしで使う) | GUIを表示し続けるためのループを開始する |
これらを組み合わせるだけで、Excel自動化スクリプトを「GUI付きアプリ」として提供できるようになります。
次の記事では、ここで紹介した要素を実際に使い、openpyxlと連携させた具体的なサンプルを作成していきます。

自動化ツールにダイアログを追加|サンプルスクリプト
実務では、利用者がPythonに詳しくない人である場合も多く、コマンド入力やエラーメッセージの読み取りが難しいケースがあります。
そのため、GUI(グラフィカル・ユーザー・インターフェース)を導入して、操作やエラー表示を視覚的にわかりやすくすることが重要です。
今回の改良ポイントは以下の通りです。
- Excelファイルが見つからないときに、エラーメッセージをダイアログで表示
- 置換対象のファイル形式を選択する際に、ラジオボタンを使って直感的に選べる
- 処理が完了したときに、結果をダイアログで通知
このようにツールにダイアログを追加することで、利用者は「何が起きているのか」を理解しやすくなり、安心して使えるようになります。
今回の学習で使用するxlsxファイルとtxtファイルを配布しますので、↓↓のダウンロードリンクをクリックして適切な場所に保存して下さい。
- ファイルの保存場所について
-
ダウンロードしたファイルは以下の階層になるように保存して下さい。
この理由については、Chapter2-1 の記事で詳しく解説しています。
Chap2/ # チャプター2全体の保存フォルダ │ ├── Chap2-1/ # チャプター2-1の保存フォルダ │ ├── Chapter2-1.py │ ├── Workbooks/ │ │ └── Chapter2-1.xlsx │ └── Chapter2-1.exe │ ├── Chap2-2/ # チャプター2-2の保存フォルダ │ ├── Chapter2-2.py │ ├── Workbooks/ │ │ └── Chapter2-2.xlsx │ ├──texts/ │ │ └── サンプルテキスト.txt │ └── Chapter2-1.exe │ ├── Chap2-3/ ├── ・・・
以下は、これまでの「表記ゆれ一斉置換ツール」に Tkinterを利用したダイアログウィンドウ を追加したサンプルコードです。
エラー表示、ファイル形式の選択、処理完了通知がすべてGUIで行えるようになっています。
前回のコードとの相違点は次の章で解説するので、まずはコード全体をコピーして実行してみましょう。
import openpyxl # xlsxを読み取るための外部モジュール
import pathlib # ファイルやフォルダのパスを扱うための標準モジュール
import sys # 実行環境を判定するために使用(py または exe)
import csv # CSVファイルを読み書きするための標準モジュール
import tkinter # GUIアプリケーションを作成するための標準モジュール
from tkinter import messagebox # メッセージ表示用のダイアログを提供するサブモジュール
# 実行環境に応じて基準ディレクトリを決定(exeかpyファイルか)
if getattr(sys, 'frozen', False):
BASE_DIR = pathlib.Path(sys.executable).parent # exe で動いている場合
else:
BASE_DIR = pathlib.Path(__file__).parent # pyファイルとして動いている場合
file_path = BASE_DIR / "workbooks" # Excelファイルを格納するフォルダ
text_path = BASE_DIR / "input_files" # 置換するファイルを格納するフォルダ
# 例外処理(Excelファイルが見つからない場合の処理)
try:
book = openpyxl.load_workbook(file_path / "Chapter2-2.xlsx")
sheet = book.active
except FileNotFoundError:
messagebox.showinfo("エラー", "置換リストがみつかりません") # ダイアログウィンドウの表示
sys.exit(1)
# 置換するファイル形式を選択(ラジオボタンの作成)
root = tkinter.Tk()
root.title("ファイル形式の選択")
# 選択結果を保持する変数
file_type_var = tkinter.StringVar(value="txt")
tkinter.Label(root, text="置換するファイル形式を選択してください(txt/csv)").pack(pady=10)
# ラジオボタン
tkinter.Radiobutton(root, text="txt", variable=file_type_var, value="txt").pack(anchor="w")
tkinter.Radiobutton(root, text="csv", variable=file_type_var, value="csv").pack(anchor="w")
# OKボタン
def on_ok():
root.quit()
root.destroy()
tkinter.Button(root, text="OK", command=on_ok).pack(pady=10)
root.mainloop()
file_type = file_type_var.get()
# 置換リスト(Excelから読み込む検索語・置換語)の定義
READ_START_ROW_NO = 3 # データ読み込みを開始する行
OLD_WORD_COL_NO = 2 # 検索する文字列が書かれた列
NEW_WORD_COL_NO = 3 # 置換後の文字列が書かれた列
old_words = [] # 検索する文字列のリスト
new_words = [] # 置換後の文字列のリスト
# Excelから置換リストを読み込む
for i in range(READ_START_ROW_NO, sheet.max_row+1): # データが書かれた全ての行に対して
old_word = sheet.cell(i, OLD_WORD_COL_NO).value # 検索語を読み取り
if old_word is None: # 検索語が空白なら
break # 繰り返しを終了
old_words.append(str(old_word)) # 検索語をリストに追加
new_word = sheet.cell(i, NEW_WORD_COL_NO).value # 置換語を読み取り
if new_word is None: # 置換語が空白なら
new_word = old_word # 検索語をそのまま使う
new_words.append(str(new_word)) # 置換語をリストに追加
# テキストファイルを処理
file_counter = 0
if file_type == "txt":
for target_file in text_path.glob(f"*.{file_type}"): # フォルダ内の全てのテキストファイルに対して
# 改行して置換開始の宣言
print()
print(f'{target_file.name}のテキストを置換します')
# テキストファイルを読み込み、検索語を置換語に置き換え
file_text = target_file.read_text(encoding = "UTF-8")
for i in range(len(old_words)):
file_text = file_text.replace(old_words[i], new_words[i])
# 新しいファイルを作成
new_file_path = target_file.parent / f"【表記ゆれ修正済み】{target_file.stem}.{file_type}"
new_file_path.write_text(file_text, encoding="UTF-8")
file_counter += 1
# CSVファイルを処理
elif file_type == "csv":
for target_file in text_path.glob(f"*.{file_type}"): # フォルダ内の全てのCSVファイルに対して
print()
print(f'{target_file.name}のCSVを置換します')
# CSVを読み込む
with open(target_file, newline='', encoding="utf-8-sig") as f:
reader = csv.reader(f)
rows = [row for row in reader]
# セル単位で置換処理
for i in range(len(old_words)):
rows = [[cell.replace(old_words[i], new_words[i]) for cell in row] for row in rows]
# 新しいCSVファイルを作成
new_file_path = target_file.parent / f"【表記ゆれ修正済み】{target_file.stem}.{file_type}"
with open(new_file_path, "w", newline='', encoding="utf-8-sig") as f:
writer = csv.writer(f)
writer.writerows(rows)
file_counter += 1
# 終了ウィンドウを表示
messagebox.showinfo("完了", f"{file_counter} ファイル置換が完了しました")サンプルスクリプトの解説|Tkinterダイアログ実装のポイント
このコードでは、これまでコンソールに表示していた情報を Tkinterのダイアログウィンドウ に置き換えています。
以下の解説はTkinterに関わる部分のみを書いています。
それ以外の部分で疑問がある人は Chapter2-4 の記事にTkinterが無いバージョンのコードとその詳細解説がありますので、そちらを参照してください。
Tkinterを使うためのモジュールを読み込む
import openpyxl # xlsxを読み取るための外部モジュール import pathlib # ファイルやフォルダのパスを扱うための標準モジュール import sys # 実行環境を判定するために使用(py または exe) import csv # CSVファイルを読み書きするための標準モジュール import tkinter # GUIアプリケーションを作成するための標準モジュール from tkinter import messagebox # メッセージ表示用のダイアログを提供するサブモジュール
ここでは、前章までに登場した openpyxl や csv などに加えて、新しく Tkinter 関連のモジュール を読み込んでいます。
import tkinter|基本のインポート
Tkinterをインポートすることで、ウィンドウを作ったり、ラジオボタン・ボタン・ラベルなどの部品を配置できるようになります。
今回は「txt/csv を選ぶラジオボタンの画面」や「OK ボタン」を作るために使います。
from tkinter import messagebox|ダイアログ表示
messagebox は Tkinter の中のサブモジュールで、メッセージをポップアップで表示するための部品 です。
例えばエラーが起きたときや処理が完了したときに、小さなダイアログウィンドウで「エラー」や「完了」と表示できるようになります。
コンソールに文字を出すよりも、ユーザーにとって分かりやすいフィードバックを与えられるのがメリットです。
ウィンドウを作成してタイトルを設定する
# 置換するファイル形式を選択(ラジオボタンの作成)
root = tkinter.Tk()
root.title("ファイル形式の選択")ここでは、画面の土台となるウィンドウ を作成しています。
tkinter.Tk()|メインウィンドウの作成
Tkinter のアプリケーションでは、まず最初に「メインウィンドウ」を作る必要があります。
このコードで空のウィンドウが生成され、そのウィンドウを表すオブジェクトが root に代入されます。
root.title(“ファイル形式の選択”)
ウィンドウのタイトルバーに表示される文字列を指定します。
今回は「ファイル形式の選択」というタイトルを設定して、これから作るラジオボタン画面の意味がわかるようにしています。
選択値の保持(StringVar)とラベル表示
# 選択結果を保持する変数 file_type_var = tkinter.StringVar(value="txt") tkinter.Label(root, text="置換するファイル形式を選択してください(txt/csv)").pack(pady=10)
ここでは、ユーザーが選んだ結果を記録するための変数と、画面上に説明文を表示するラベルを用意しています。
tkinter.StringVar(value=”txt”)|既定値を設定
- Tkinter で「ラジオボタン」や「チェックボックス」などを使うときは、選択結果を格納する専用の変数オブジェクトが必要です。
StringVarは文字列用の変数オブジェクトで、ここでは初期値を"txt"にしています。- 後でラジオボタンと連動させることで、ユーザーが「txt」か「csv」を選んだ結果がこの変数に入ります。
tkinter.Label(…)|Labelで案内テキストを表示
- 画面に文字を表示するためのウィジェット(部品)です。
text="置換するファイル形式を選択してください(txt/csv)"でラベルに表示する文章を指定しています。.pack(pady=10)で配置を行い、上下に 10 ピクセルの余白を空けています。
Radiobuttonで拡張子を選択(txt/csv)
# ラジオボタン tkinter.Radiobutton(root, text="txt", variable=file_type_var, value="txt").pack(anchor="w") tkinter.Radiobutton(root, text="csv", variable=file_type_var, value="csv").pack(anchor="w")
ここでは、ユーザーが 「txt」か「csv」かを選べるラジオボタン を2つ作っています。
tkinter.Radiobutton(…)|variable/valueの設定
ラジオボタン(丸い選択ボタン)を作るためのクラスです。
いくつかの引数を指定することで、動作や見た目を決めています。
root
このラジオボタンを配置する親ウィンドウ。ここではrootに作成します。text="txt"/text="csv"
ラジオボタンの横に表示される文字列です。variable=file_type_var
どのラジオボタンが選ばれたかを記録するための変数です。
先ほど用意したStringVar(file_type_var)がここに使われています。value="txt"/value="csv"
そのボタンが選ばれたときにfile_type_varに格納される値です。
→ 「txt」を選べば"txt"が、「csv」を選べば"csv"が変数に入ります。
.pack(anchor=”w”)|pack配置
pack でウィジェットを配置します。anchor="w" は「西(West)」=左寄せで並べる指定です。
これで2つのラジオボタンが縦に左揃えで配置されます。
OKボタンのイベントで値を取得
# OKボタン
def on_ok():
root.quit()
root.destroy()
tkinter.Button(root, text="OK", command=on_ok).pack(pady=10)
root.mainloop()
file_type = file_type_var.get()ここでは、ユーザーが選んだファイル形式を確定し、プログラムに渡す処理をしています。
def on_ok(): …|on_okコールバックの定義
「OK」ボタンをクリックしたときに実行される関数を定義しています。
root.quit(): Tkinter のイベントループを終了させます。root.destroy(): 表示しているウィンドウを閉じます。
→ これでGUI画面を終了できるようになります。
tkinter.Button()|Buttonのcommandに関数をバインド
- ボタンを作成します。
text="OK"でボタンに表示する文字を指定。command=on_okでクリック時に実行する関数を登録しています。.pack(pady=10)で配置し、上下に余白をつけています。
root.mainloop()|イベントループ開始
Tkinter の イベントループ を開始します。
これを書かないと、ウィンドウは一瞬で消えてしまうため必須です。プログラムはユーザーの操作(ボタンクリックなど)を待ち続けます。
file_type = file_type_var.get()|選択値を取得
ウィンドウが閉じられた後に、ラジオボタンで選択された結果を取得します。
「txt」が選ばれていれば "txt"、「csv」が選ばれていれば "csv" が file_type に代入されます。
PyInstallerでEXE化・まとめ
Tkinterを使ってダイアログを導入したツールは、そのままPythonスクリプトとしても動作しますが、実務で利用するには 実行ファイル化(exe化) して配布できるようにすることが重要です。
これにより、Pythonをインストールしていない利用者でもワンクリックで起動できるようになります。
PyInstallerでツール化しよう
実務で使用するためには、Pythonのソースコードを毎回コマンドラインから実行するのではなく、誰でも簡単にダブルクリックで動かせる実行ファイル(exe形式) にしておきましょう。
この手順についてはすでに 過去の記事で解説済み なので、ここでの説明は省略します。
コマンドプロンプト以下のコードを実行してください。
pyinstaller --onefile Chapter2-5-1.py
これで、前回と同様にPythonをインストールしていないPCでも実行できるようになります。
作成されたexeファイルを適切な位置に移動させることを忘れないよう注意しましょう。
まとめ
今回のチャプターでは、ツールにGUI(グラフィカル・ユーザー・インターフェース)を導入する方法を学びました。
これで、コンソールでの操作が不要な、実務により適したツールが完成しました。
この後の練習問題では、このツールにもう一つGUIを追加して「表記ゆれ一斉置換ツール」を完成させましょう。
次のステップ:業務自動化を「実務レベル」まで引き上げたい方へ
このコース(Chapter1〜2)の無料教材では、Python と Excel(openpyxl)を使って「単純作業を自動化する」ための基本的な考え方やコードの書き方を身につけることができます。
ただ、実際の業務で使おうとすると、次のような壁にぶつかりがちです。
- 社内で使える「ちゃんとしたツール」っぽい形にしたい
- エラーが出たときに、自分で原因を特定して直せない
- 副業したくても本当に正しく動くか自信がない
そこで、格安で販売中のChapter3以降では「現場でそのまま使える業務自動化スクリプト」を作りながら学べる構成としました。
そこでは、Chapter2までで学んだ内容を土台にしつつ、
- 実務でよくあるパターン別のサンプルコード
- トラブルシューティング(エラーの潰し方)の考え方
- より高度な自動化を実現するWebスクレイピングの基本
- 業務自動化スキルを用いて副業で稼ぐための具体的な方法
などを通して、「自分の職場に合わせてカスタマイズできる力」を身につけることを目指します。
教材は↓↓のリンクボタンの販売所で購入するとPDFやpyファイルでダウンロードできます。
もしくは、各学習記事内で会員登録して頂くと、そのままこのサイト内で全ての記事を読めるようになります。
どこよりも安く手実践的なこの教材を、是非ご活用下さい^^


