【Python】tkinterでファイル選択ダイアログのみ生成

Created 2019年4月20日19:23
Updated 2019年4月20日19:29
Categories Python

Googleとかで探すとroot.withdraw()使えって言われますが、これだけだとWindowsでうまく動かなかったためいろいろと工夫してみました。

環境

  • Python 3.7.3
  • Windows 10 Home 1809 64bit
  • macOS Mojave 10.14.4 64bit

コード

from tkinter import filedialog, Tk
import platform

# ダイアログ用のルートウィンドウの作成
root = Tk()
# ウィンドウサイズを0にする(Windows用の設定)
root.geometry("0x0")
# ウィンドウのタイトルバーを消す(Windows用の設定)
root.overrideredirect(1)
# ウィンドウを非表示に
root.withdraw()
system = platform.system()


def select_file():
    # Windowsの場合withdrawの状態だとダイアログも
    # 非表示になるため、rootウィンドウを表示する
    if system == "Windows":
        root.deiconify()
    # macOS用にダイアログ作成前後でupdate()を呼ぶ
    root.update()
    # ダイアログを前面に
    root.lift()
    root.focus_force()
    path_str = filedialog.askopenfilename()
    root.update()
    if system == "Windows":
        # 再度非表示化(Windowsのみ)
        root.withdraw()
    path = Path(path_str)
    return path.absolute()

コードの説明

root.withdraw()はルートウィンドウを非表示にする関数です。

普通のtkinterアプリは何か元になるウィンドウから選択ダイアログを作りますが、ダイアログだけ出したいときはこの関数を使って非表示にします。

macOSではこれでうまくいきましたが、Windowsではファイル選択のダイアログも非表示になってしまいました。

そこで、Windowsに限りサイズが0でタイトルバーも消去した全く見えないウィンドウを表示し、その下にダイアログを作成しています。

正直macOSでもこれで良い気がしてきましたが、一応使えるならどっちか効けばいいかなーみたいな気持ちで残しています。

コメントを投稿

コメント