Tkinterで用いるdialogとは?コードを踏まえてわかりやすく解説!?
今回はTkinterで用いるdialogの使い方を、コードを踏まえてわかりやすく解説いたします。dialogの使い方がわからない、dialogの理解を深めたい方へおすすめです。ぜひ最後までご覧ください。
- そもそもTkinterで使われるdialogとは?
- 【dialogその1】simpledialog
- 【dialogその2】filedialog
- 【dialogその3】messagebox
- simpledialogをカスタマイズしてみる
- まとめ
- 参考文献
執筆者 - おすすめの記事3選
そもそもTkinterで使われるdialogとは?
Tkinterで使われるdialogとは、ユーザーへ何らかの入力をお願いしたり、メッセージを確認してもらうために、操作の最中で一時的に開かれる小さい画面をいいます。
具体的なイメージとしては、以下の画像のオレンジ色枠で囲まれる小さい画面を表します。
dialogを使う目的
dialogを使う目的として、
- 操作不十分な場合に、ユーザーへエラーメッセージを伝えられる
- 重要な操作を行う前に、確認の意味でユーザーへ質問を投げかけられる
- 操作した結果を表示して、ユーザーを安心させる
などがあります。
確かに操作した結果をメッセージでいただくと安心しますね。
以降からdialogの種類や使い方を、コードを通じて丁寧に解説いたします。是非最後までご一読ください。
【dialogその1】simpledialog
simpledialogは質問に答えてもらう形式のdialogを作成する際に利用されます。具体的な活用例を3種類ほど、ご紹介いたします。
askstring
文字列を入力して質問に答えてもらう場合に利用します。
1import tkinter.simpledialog as simpledialog
2
3# 第一引数 : タイトル文字列
4# 第二引数 : 値入力を促すメッセージ内容
5# 戻り値 : OKを選択した場合 : 文字列, Cancelを選択した場合 : None
6res = simpledialog.askstring("タイトル文字列", "値入力を促すメッセージ内容")
で定義されます。戻り値としてOKを選択した場合 : 文字列, Cancelを選択した場合 : Noneが返されます。
例えば以下のようなコードを作成すると、
1import tkinter as tk
2import tkinter.simpledialog as simpledialog
3
4# simpledialogのaskstringのdialogを表示する。
5def getAskString():
6 # 文字列で答える質問を提供するsimpledialogになります。
7 # 第一引数 : タイトル文字列
8 # 第二引数 : 値入力を促すメッセージ内容
9 # 戻り値 : OKを選択した場合 : 文字列, Cancelを選択した場合 : None
10 res = simpledialog.askstring("アンパンマンで好きなキャラクターは?", "好きなキャラクターを入力してください。")
11 # レスポンスの内容を表示する。
12 print("askstring", res)
13
14# Tkinter初学者参考 : https://docs.python.org/ja/3/library/tkinter.html#a-simple-hello-world-program
15if __name__ == "__main__":
16 # Windowを生成する。
17 # Windowについて : https://kuroro.blog/python/116yLvTkzH2AUJj8FHLx/
18 root = tk.Tk()
19 # Windowの非表示
20 root.withdraw()
21
22 getAskString()
以下の画像のようにdialogを表示します。
askfloat
浮動小数点数を入力して質問に答えてもらう場合に利用します。
1import tkinter.simpledialog as simpledialog
2
3# 第一引数 : タイトル文字列
4# 第二引数 : 値入力を促すメッセージ内容
5# 戻り値 : OKを選択した場合 : 浮動小数点数, Cancelを選択した場合 : None
6res = simpledialog.askfloat("タイトル文字列", "値入力を促すメッセージ内容")
で定義されます。戻り値としてOKを選択した場合 : 浮動小数点数, Cancelを選択した場合 : Noneが返されます。
例えば以下のようなコードを作成すると、
1import tkinter as tk
2import tkinter.simpledialog as simpledialog
3
4# simpledialogのaskfloatのdialogを表示する。
5def getAskFloat():
6 # 浮動小数点数で答える質問を提供するsimpledialogになります。
7 # 第一引数 : タイトル文字列
8 # 第二引数 : 値入力を促すメッセージ内容
9 # 戻り値 : OKを選択した場合 : 浮動小数点数, Cancelを選択した場合 : None
10 res = simpledialog.askfloat("好きな浮動小数点数はなんですか?", "好きな浮動小数点数を入力してください。")
11 # レスポンスの内容を表示する。
12 print("askfloat", res)
13
14# Tkinter初学者参考 : https://docs.python.org/ja/3/library/tkinter.html#a-simple-hello-world-program
15if __name__ == "__main__":
16 # Windowを生成する。
17 # Windowについて : https://kuroro.blog/python/116yLvTkzH2AUJj8FHLx/
18 root = tk.Tk()
19 # Windowの非表示
20 root.withdraw()
21
22 getAskFloat()
以下の画像のようにdialogを表示します。
askinteger
整数を入力して質問に答えてもらう場合に利用します。
1import tkinter.simpledialog as simpledialog
2
3# 第一引数 : タイトル文字列
4# 第二引数 : 値入力を促すメッセージ内容
5# 戻り値 : OKを選択した場合 : 整数, Cancelを選択した場合 : None
6res = simpledialog.askinteger("タイトル文字列", "値入力を促すメッセージ内容")
で定義されます。戻り値としてOKを選択した場合 : 整数, Cancelを選択した場合 : Noneが返されます。
例えば以下のようなコードを作成すると、
1import tkinter as tk
2import tkinter.simpledialog as simpledialog
3
4# simpledialogのaskintegerのdialogを表示する。
5def getAskInteger():
6 # 整数で答える質問を提供するsimpledialogになります。
7 # 第一引数 : タイトル文字列
8 # 第二引数 : 値入力を促すメッセージ内容
9 # 戻り値 : OKを選択した場合 : 整数, Cancelを選択した場合 : None
10 res = simpledialog.askinteger("好きな整数はなんですか?", "好きな整数を入力してください。")
11 # レスポンスの内容を表示する。
12 print("askinteger", res)
13
14# Tkinter初学者参考 : https://docs.python.org/ja/3/library/tkinter.html#a-simple-hello-world-program
15if __name__ == "__main__":
16 # Windowを生成する。
17 # Windowについて : https://kuroro.blog/python/116yLvTkzH2AUJj8FHLx/
18 root = tk.Tk()
19 # Windowの非表示
20 root.withdraw()
21
22 getAskInteger()
以下の画像のようにdialogを表示します。
【dialogその2】filedialog
filedialogはdialogを通してファイル操作を行うために利用します。具体的な活用例を7種類ほど、ご紹介いたします。
askopenfilename
dialogを通して単数ファイルを選択し、ファイルパスを取得する場合に利用します。
1from tkinter import filedialog
2
3# 第一引数以降(任意) : option
4# 戻り値 : Openを選択してファイルを開いた場合 : ファイルパス, Cancelを選択した場合 : ''
5filename = filedialog.askopenfilename(option1, option2, ...)
で定義されます。戻り値としてOpenを選択してファイルを開いた場合 : ファイルパス, Cancelを選択した場合 : '' が返されます。
例えば以下のようなコードを作成すると、
1import tkinter as tk
2from tkinter import filedialog
3
4# filedialogのaskopenfilenameのdialogを表示する。
5def getAskOpenFileName():
6 # 単数ファイルを選択するためのdialogになります。
7 # 戻り値 : Openを選択してファイルを開いた場合 : ファイルパス, Cancelを選択した場合 : ''
8 filename = filedialog.askopenfilename()
9 # レスポンスの内容を表示する。
10 print("ask open file name", filename)
11
12# Tkinter初学者参考 : https://docs.python.org/ja/3/library/tkinter.html#a-simple-hello-world-program
13if __name__ == "__main__":
14 # Windowを生成する。
15 # Windowについて : https://kuroro.blog/python/116yLvTkzH2AUJj8FHLx/
16 root = tk.Tk()
17 # Windowの非表示
18 root.withdraw()
19
20 getAskOpenFileName()
以下の画像のように、dialogを通してファイルパスを取得します。
askopenfilenames
dialogを通して単数 or 複数ファイルを選択し、ファイルパスを取得する場合に利用します。
1from tkinter import filedialog
2
3# 第一引数以降(任意) : option
4# 戻り値 : Openを選択してファイルを開いた場合 : (ファイルパス1, ファイルパス2), Cancelを選択した場合 : ''
5filepaths = filedialog.askopenfilenames(option1, option2, ...)
で定義されます。戻り値としてOpenを選択してファイルを開いた場合 : (ファイルパス1, ファイルパス2), Cancelを選択した場合 : '' が返されます。
例えば以下のようなコードを作成すると、
1import tkinter as tk
2from tkinter import filedialog
3
4# filedialogのaskopenfilenamesのdialogを表示する。
5def getAskOpenFileNames():
6 # 単数もしくは複数ファイルを選択するためのdialogになります。
7 # 戻り値 : Openの場合 : (ファイルパス1, ファイルパス2...), Cancelの場合 : ''
8 filepaths = filedialog.askopenfilenames()
9 # レスポンスの内容を表示する。
10 print("ask open file names", filepaths)
11
12# Tkinter初学者参考 : https://docs.python.org/ja/3/library/tkinter.html#a-simple-hello-world-program
13if __name__ == "__main__":
14 # Windowを生成する。
15 # Windowについて : https://kuroro.blog/python/116yLvTkzH2AUJj8FHLx/
16 root = tk.Tk()
17 # Windowの非表示
18 root.withdraw()
19
20 getAskOpenFileNames()
以下の画像のように、dialogを通してファイルパスを取得します。
askopenfile
dialogを通して単数ファイルを選択し、ファイル情報を取得する場合に利用します。
1from tkinter import filedialog
2
3# 第一引数以降(任意) : option
4# 戻り値 : Openを選択してファイルを開いた場合 : ファイル情報, Cancelを選択した場合 : None
5fileData = filedialog.askopenfile(option1, option2, ...)
で定義されます。戻り値としてOpenを選択してファイルを開いた場合 : ファイル情報, Cancelを選択した場合 : Noneが返されます。
例えば以下のようなコードを作成すると、
1import tkinter as tk
2from tkinter import filedialog
3
4# filedialogのaskopenfileのdialogを表示する。
5def getAskOpenFile():
6 # 単数ファイル選択するためのdialogになります。
7 # read only
8 # 戻り値 : Openを選択してファイルを開いた場合 : ファイル情報, Cancelを選択した場合 : None
9 fileData = filedialog.askopenfile()
10 # レスポンスの内容を表示する。
11 print("ask open file", fileData)
12
13# Tkinter初学者参考 : https://docs.python.org/ja/3/library/tkinter.html#a-simple-hello-world-program
14if __name__ == "__main__":
15 # Windowを生成する。
16 # Windowについて : https://kuroro.blog/python/116yLvTkzH2AUJj8FHLx/
17 root = tk.Tk()
18 # Windowの非表示
19 root.withdraw()
20
21 getAskOpenFile()
以下の画像のように、dialogを通してファイル情報を取得します。
askopenfiles
dialogを通して単数 or 複数ファイルを選択し、ファイル情報を取得する場合に利用します。
1from tkinter import filedialog
2
3# 第一引数以降(任意) : option
4# 戻り値 : Openを選択してファイルを開いた場合 : [ファイル情報1, ファイル情報2, ...], Cancelを選択した場合 : ''
5fileData = filedialog.askopenfiles(option1, option2, ...)
で定義されます。戻り値としてOpenを選択してファイルを開いた場合 : [ファイル情報1, ファイル情報2, ...], Cancelを選択した場合 : '' が返されます。
例えば以下のようなコードを作成すると、
1import tkinter as tk
2from tkinter import filedialog
3
4# filedialogのaskopenfilesのdialogを表示する。
5def getAskOpenFiles():
6 # 複数ファイル選択するためのdialogになります。
7 # read only
8 # 戻り値 : Openを選択してファイルを開いた場合 : [ファイル情報1, ファイル情報2, ...], Cancelを選択した場合 : ''
9 fileData = filedialog.askopenfiles()
10 # レスポンスの内容を表示する。
11 print("ask open files", fileData)
12
13# Tkinter初学者参考 : https://docs.python.org/ja/3/library/tkinter.html#a-simple-hello-world-program
14if __name__ == "__main__":
15 # Windowを生成する。
16 # Windowについて : https://kuroro.blog/python/116yLvTkzH2AUJj8FHLx/
17 root = tk.Tk()
18 # Windowの非表示
19 root.withdraw()
20
21 getAskOpenFiles()
以下の画像のように、dialogを通してファイル情報を取得します。
asksaveasfile
dialogを通して単数ファイルを保存する場合に利用します。
1from tkinter import filedialog
2
3# 第一引数以降(任意) : option
4# 戻り値 : Saveを選択してファイルを保存した場合 : ファイル情報, Cancelを選択した場合 : None
5fileData = filedialog.asksaveasfile(option1, option2, ...)
で定義されます。戻り値としてSaveを選択してファイルを保存した場合 : ファイル情報, Cancelを選択した場合 : Noneが返されます。
例えば以下のようなコードを作成すると、
1import tkinter as tk
2from tkinter import filedialog
3
4# filedialogのasksaveasfileのdialogを表示する。
5def getAskSaveAsFile():
6 # 単数ファイルを保存するためのdialogになります。
7 # write only
8 # 戻り値 : Saveを選択してファイルを保存した場合 : ファイル情報, Cancelを選択した場合 : None
9 fileData = filedialog.asksaveasfile()
10 # レスポンスの内容を表示する。
11 print("ask save as file", fileData)
12
13# Tkinter初学者参考 : https://docs.python.org/ja/3/library/tkinter.html#a-simple-hello-world-program
14if __name__ == "__main__":
15 # Windowを生成する。
16 # Windowについて : https://kuroro.blog/python/116yLvTkzH2AUJj8FHLx/
17 root = tk.Tk()
18 # Windowの非表示
19 root.withdraw()
20
21 getAskSaveAsFile()
以下の画像のように、ファイルを保存します。
asksaveasfilename
dialogを通して単数ファイルを保存する場合に利用します。
1from tkinter import filedialog
2
3# 第一引数以降(任意) : option
4# 戻り値 : Saveを選択してファイルを保存した場合 : ファイルパス, Cancelを選択した場合 : ''
5filename = filedialog.asksaveasfilename(option1, option2, ...)
で定義されます。戻り値としてSaveを選択してファイルを保存した場合 : ファイルパス, Cancelを選択した場合 : '' が返されます。
※筆者のMac環境ではファイル保存されませんでした。下にコードは貼り付けておきます。
1import tkinter as tk
2from tkinter import filedialog
3
4# filedialogのasksaveasfilenameのdialogを表示する。
5def getAskSaveAsFileName():
6 # 単数ファイルを保存するためのdialogになります。
7 # ※筆者のMac OS環境ではファイル保存されませんでした。
8 # 戻り値 : Saveを選択してファイルを保存した場合 : ファイルパス, Cancelを選択した場合 : ''
9 filename = filedialog.asksaveasfilename()
10 # レスポンスの内容を表示する。
11 print("ask save as file name", filename)
12
13# Tkinter初学者参考 : https://docs.python.org/ja/3/library/tkinter.html#a-simple-hello-world-program
14if __name__ == "__main__":
15 # Windowを生成する。
16 # Windowについて : https://kuroro.blog/python/116yLvTkzH2AUJj8FHLx/
17 root = tk.Tk()
18 # Windowの非表示
19 root.withdraw()
20
21 getAskSaveAsFileName()
askdirectory
dialogを通してディクレトリを選択し、ディレクトリパスを取得する場合に利用します。
1from tkinter import filedialog
2
3# 第一引数以降(任意) : option
4# 戻り値 : Chooseを選択してディレクトリを開いた場合 : ディレクトリパス, Cancelを選択した場合 : ''
5directoryName = filedialog.askdirectory(option1, option2, ...)
で定義されます。戻り値としてChooseを選択してディレクトリを開いた場合 : ディレクトリパス, Cancelを選択した場合 : '' が返されます。
例えば以下のようなコードを作成すると、
1import tkinter as tk
2from tkinter import filedialog
3
4# filedialogのaskdirectoryのdialogを表示する。
5def getAskDirectory():
6 # ディクレトリを選択するためのdialogになります。
7 # 戻り値 : Chooseを選択してディレクトリを開いた場合 : ディレクトリパス, Cancelを選択した場合 : ''
8 directoryName = filedialog.askdirectory()
9 # レスポンスの内容を表示する。
10 print("ask directory", directoryName)
11
12# Tkinter初学者参考 : https://docs.python.org/ja/3/library/tkinter.html#a-simple-hello-world-program
13if __name__ == "__main__":
14 # Windowを生成する。
15 # Windowについて : https://kuroro.blog/python/116yLvTkzH2AUJj8FHLx/
16 root = tk.Tk()
17 # Windowの非表示
18 root.withdraw()
19
20 getAskDirectory()
以下の画像のようにディレクトリパスを取得します。
filedialogに関するoption
filedialogを活用する上で便利なoptionがあります。以下の表に使い方をまとめましたので、ご確認下さい。
option名 | 説明文 | 用例 |
---|---|---|
parent | Windowの上にfiledialogを表示する。 | filedialog.askdirectory(parent=root) |
title | filedialogのtitleを変更する。 | filedialog.askopenfile(title='hoghoge') |
initialdir | filedialogを初期で開くディレクトリを設定する。 | filedialog.askopenfile(initialdir='./') |
initialfile | 保存するファイル名を初期化する。 | filedialog.asksaveasfile(initialfile='hogehoge.txt') |
filetypes | 選択できるファイル形式を限定する。 | filedialog.askopenfilename(filetypes=[("JPEG", ".jpg")]) |
defaultextension | 拡張子をつけないでファイル保存する場合に、指定した拡張子を自動設定します。 | filedialog.asksaveasfile(defaultextension="jpg") |
multiple | Trueにすると、ファイルの複数選択が可能になります。どのfiledialogに関しても、対応可能です。 | filedialog.askopenfilename(multiple=True) |
詳細に関してはこちらをご確認ください。
【dialogその3】messagebox
messageboxは、ユーザーへメッセージを表示したり、簡単な質問へ回答してもらう場合に利用します。
messageboxに関しては、別の記事で丁寧にまとめましたので、【サンプルコード付】Tkinterで使われるmessageboxの活用法を解説をご覧ください。
simpledialogをカスタマイズしてみる
先ほどまで様々なdialogを見てきましたが、型通りでカスタマイズされたdialogは作成していませんでした。
そこで「simpledialogをカスタマイズしてみる」では、simpledialogを活用して、dialogをカスタマイズしたいと思います。
どのようにしてdialogをカスタマイズする?
dialogをカスタマイズする前に、まずはsimpledialogがどのように作られているのか、知る必要があります。
以下の画像をご覧ください。
画像の通り、simpledialogは、
- simpledialog.Dialogクラスで形成される
- simpledialog.Dialogクラス内に、関数を持たせて部品化している
- body関数でボタン上の項目を表現している
- buttonbox関数でボタン項目を表現している
- OKボタンを実行後に、apply関数が実行される
ように作られています。
よって、
ことで実現できます。
サンプルコード
試しに以下のようなコードを作成してみました。
1import tkinter as tk
2import tkinter.simpledialog as simpledialog
3
4# simpledialog.Dialogクラスを継承したCustomDialogクラスを作成する。
5# 1. 新しくクラスを作成する
6# 2. 新しく作成するクラスにsimpledialog.Dialogのクラスを継承する
7class CustomDialog(simpledialog.Dialog):
8 # じゃんけんの手の情報を格納する変数
9 handList = [
10 'グー',
11 'チョキ',
12 'パー',
13 ]
14 # 現在選択されているラジオボタンの値を格納する変数
15 variable = None
16
17 # 3. body関数, buttonbox関数, apply関数をオーバーライドしてカスタマイズする
18 def body(self, master):
19 # bodyを親要素として、label Widgetを作成する。
20 # text : テキスト情報
21 # Labelについて : https://kuroro.blog/python/Pj4Z7JBNRvcHZvtFqiKD/
22 label = tk.Label(master, text='じゃんけんの手を選択してください。')
23 # bodyを親要素として、label Widgetをどのように配置するのか?
24 # packについて : https://kuroro.blog/python/UuvLfIBIEaw98BzBZ3FJ/
25 label.pack()
26
27 # 現在選択されているラジオボタンの値を文字列変数として扱う。
28 # StringVarについて : https://kuroro.blog/python/K53voPjJuKFfYrjmP8FP/
29 self.variable = tk.StringVar()
30 for hand in self.handList:
31 # bodyを親要素として、radiobutton Widgetを作成する。
32 # value : ラジオボタン自身が持つ値の設定。グー or チョキ or パー
33 # variable : 現在選択中のラジオボタンの値を設定。文字列変数(self.variable)として値を持たせることで、可変として扱い、その他のラジオボタンへ値を共有して選択の状態を管理できる。
34 # command : ラジオボタンを選択した場合に、実行する関数を設定。self.switchButtonStateとする。
35 # text : ラジオボタンを説明するテキスト。
36 # Radiobuttonについて : https://kuroro.blog/python/ztJbt5uabbTBMCGcljHc/
37 radiobutton = tk.Radiobutton(master, value=hand, variable=self.variable, command=self.switchButtonState, text=hand)
38 # bodyを親要素として、radiobutton Widgetをどのように配置するのか?
39 # packについて : https://kuroro.blog/python/UuvLfIBIEaw98BzBZ3FJ/
40 radiobutton.pack(side=tk.LEFT, padx=5, pady=5)
41
42 # 3. body関数, buttonbox関数, apply関数をオーバーライドしてカスタマイズする
43 def buttonbox(self):
44 # buttonboxを親要素として、frame Widget(Frame)を作成する。
45 # Frameについて : https://kuroro.blog/python/P20XOidA5nh583fYRvxf/
46 frame = tk.Frame(self)
47 # buttonboxを親要素として、frame Widget(Frame)をどのように配置するのか?
48 # packについて : https://kuroro.blog/python/UuvLfIBIEaw98BzBZ3FJ/
49 frame.pack()
50
51 # frame Widget(Frame)を親要素として、button Widgetを作成する。
52 # text : テキスト情報
53 # width : 幅の設定
54 # command : ボタンを選択した場合に、実行する関数を設定する。self.okとする。
55 # state : ボタンの状態を設定する。ラジオボタンが選択されていない初期状態では、tk.DISABLEDにして選択できないようにする。
56 # Buttonについて : https://kuroro.blog/python/oFju6EngDtcYtIiMIDf1/
57 self.selectBtn = tk.Button(frame, text="Select", width=10, command=self.ok, state=tk.DISABLED)
58 # frame Widget(Frame)を親要素として、button Widgetをどのように配置するのか?
59 # packについて : https://kuroro.blog/python/UuvLfIBIEaw98BzBZ3FJ/
60 self.selectBtn.pack(side=tk.LEFT, padx=5, pady=5)
61
62 # frame Widget(Frame)を親要素として、button Widgetを作成する。
63 # text : テキスト情報
64 # width : 幅の設定
65 # command : ボタンを選択した場合に、実行する関数を設定する。self.cancelとする。
66 # Buttonについて : https://kuroro.blog/python/oFju6EngDtcYtIiMIDf1/
67 self.cancelBtn = tk.Button(frame, text="Cancel", width=10, command=self.cancel)
68 # frame Widget(Frame)を親要素として、button Widgetをどのように配置するのか?
69 # packについて : https://kuroro.blog/python/UuvLfIBIEaw98BzBZ3FJ/
70 self.cancelBtn.pack(side=tk.LEFT, padx=5, pady=5)
71
72 def switchButtonState(self):
73 # ラジオボタンが選択された場合に、Selectボタンを有効化する。
74 if self.selectBtn['state'] == tk.DISABLED:
75 self.selectBtn['state'] = tk.NORMAL
76
77 # 3. body関数, buttonbox関数, apply関数をオーバーライドしてカスタマイズする
78 def apply(self):
79 # dialogを閉じた後に、ラジオボタンの選択結果を出力する。
80 print(self.variable.get())
81
82# Tkinter初学者参考 : https://docs.python.org/ja/3/library/tkinter.html#a-simple-hello-world-program
83if __name__ == "__main__":
84 # Windowを生成する。
85 # Windowについて : https://kuroro.blog/python/116yLvTkzH2AUJj8FHLx/
86 root = tk.Tk()
87 # Windowの非表示
88 root.withdraw()
89
90 CustomDialog(root)
上記のコードをPython環境で実行すると、以下の画像のようにsimpledialogのカスタマイズが可能になります。
まとめ
- Tkinterで使われるdialogとは、ユーザーへ何らかの入力をお願いしたり、メッセージを確認してもらうために、操作の最中で一時的に開かれる小さい画面を表す。
- dialogを使う目的として、操作した結果を表示して、ユーザーを安心させる用途がある。