今日も見に来てくださって、ありがとうございます。
先日からの続きですが、tkinterに用意されているダイアログで、情報取得用のダイアログをまとめてみました。









画像を張り付けるとそれだけで記事が多くなるなぁ、というのは置いといて、上記の画面を実行するためのスクリプトは以下の通りです。
import tkinter.filedialog as fd
import tkinter.colorchooser as cc
import tkinter.simpledialog as sd
class OtherDialogSample(tk.Tk):
def create_dialog_button(self, group, dialog, argcount=None):
def command():
if argcount == 2:
ret = dialog(title=dialog.__name__, prompt=dialog.__doc__)
else:
ret = dialog()
print(ret)
button = tk.Button(group, text=dialog.__name__, command=command)
button.pack(padx=10,pady=10,fill=tk.BOTH)
def __init__(self):
super().__init__()
self.title("Other Dialog Sample")
self.g1 = tk.LabelFrame(self, text="ファイルダイアログのサンプル")
self.g1.pack(padx=10, pady=10,side=tk.LEFT)
self.create_dialog_button(self.g1, fd.askopenfilename)
self.create_dialog_button(self.g1, fd.asksaveasfilename)
self.create_dialog_button(self.g1, fd.askopenfilenames)
self.create_dialog_button(self.g1, fd.askdirectory)
self.g2 = tk.LabelFrame(self, text="その他のダイアログのサンプル")
self.g2.pack(padx=10,pady=10,fill=tk.BOTH,side=tk.LEFT)
self.create_dialog_button(self.g2, cc.askcolor)
self.create_dialog_button(self.g2, sd.askfloat, 2)
self.create_dialog_button(self.g2, sd.askinteger, 2)
self.create_dialog_button(self.g2, sd.askstring, 2)
if __name__ == "__main__":
ods = OtherDialogSample()
ods.mainloop()
いろいろと説明したいことはありますが、、、とりあえずまとめます。
| ダイアログ | タイトル | 戻り値 | キャンセル時 | 備考 |
| askopenfilename | 開く | フルパス文字列 | 空文字列 | 指定ファイルが存在しない場合メッセージ出力、続行不可 |
| asksaveasfilename | 名前を付けて保存 | フルパス文字列 | 空文字列 | 既存ファイル選択時は警告メッセージ出力 |
| askopenfilenames | 開く | フルパス文字列のタプル | 空文字列 | 複数ファイル選択可能 |
| askdirectory | フォルダの選択 | フォルダ文字列 | 空文字列 | |
| askcolor | 色の設定 | タプル((R,G,B),色表現文字列) | (None,None) | |
| askfloat | 指定文字列(必須) | float値 | None | float値以外はエラー |
| askinteger | 指定文字列(必須) | int値 | None | int値以外はエラー |
| askstring | 指定文字列(必須) | string値 | None |
気になったのはファイルダイアログ関連の戻り値で、なぜか区切り文字がUnix風の「/(スラッシュ)」でした。ぼくの環境はWindowsなので、「\(円マーク)」を期待していたのですけど違っていました。これはおそらくTkがもともとUnix環境用として開発され始めたことが原因なんじゃないかなぁ。
askcolorの戻り値も気になりました。R,G,Bがなぜかfloat型なのですよねぇ。Tkのページでは0~65535のRed、Green、Blueの値を返す、となっているのですけど、tkinter内では受け取った値を256で割り算しているのです。取得した値を調べてみると2バイト値には同じ値が入力されていました。(例:0xFFFF、0xC0C0など)16ビットのうち、実質8ビットだけ必要なので、256で割り算して算出していたのでしょうね。これは、Python2系の処理が/で割り算した答えをint型に返していた名残なのだと思います。Python3系では、//で割り算すればint型にしてくれるのですけど、過去の経緯もあって変えられないのかな。
その他の特記事項としては、ファイルダイアログではパラメータのinitialdirで初期ディレクトリを指定可能で、今回選択したディレクトリが次回のinitialdirにセットされます。filetypeで表示するファイルタイプを指定可能です。ファイルタイプはfiletype=(("すべてのファイル","*.*"), ("テキストファイル", "*.txt *.log *.csv"))のように、表示するラベルとファイル名のマッチングパターンの二つの文字列を含むタプルのタプルで指定します。拡張子が未指定の時のために、defaultextensionで拡張子の初期値をセットすることも可能です。simpledialogで定義されているaskfloat、askinteger、askstringについては、初期値と最小値、最大値がそれぞれ、initialvalue、minvalue、maxvalueで指定可能です。
まずは、用意されているダイアログをうまく使えるようになりたいですね。


