Tkinter情報を取得するダイアログ

 今日も見に来てくださって、ありがとうございます。

先日からの続きですが、tkinterに用意されているダイアログで、情報取得用のダイアログをまとめてみました。

実行結果
askopenfilename
asksaveasfilename
askopenfilenames
askdirectory
askcolor
askfloat
askinteger
askstring

画像を張り付けるとそれだけで記事が多くなるなぁ、というのは置いといて、上記の画面を実行するためのスクリプトは以下の通りです。

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値Nonefloat値以外はエラー
askinteger指定文字列(必須)int値Noneint値以外はエラー
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で定義されているaskfloataskintegeraskstringについては、初期値と最小値、最大値がそれぞれ、initialvalueminvaluemaxvalueで指定可能です。

まずは、用意されているダイアログをうまく使えるようになりたいですね。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です


The reCAPTCHA verification period has expired. Please reload the page.