今日も見に来てくださって、ありがとうございます。
先日からの続きですが、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
で指定可能です。
まずは、用意されているダイアログをうまく使えるようになりたいですね。