このわがままさんめ。でも出来るよ、Tkinterならね。
画面用意するほどじゃないんだけどファイルパスを手打ちなんてしたくないし規定の場所なんてものを作って動かしたりしてるとそのうち何をどうやって動かしていいのかわからなくなったりしてその度にいちいちコード読み返さなきゃいけなくなったりで大変。
処理自体はコンソールでいいんだけどファイルを選ぶのだけはダイアログを使いたい。
そういったケースが結構多いのでそのやり方について。(ダウンロードしてきたCSVを処理したいとかね、いつもファイル名とか場所がころころ変わるとかね)
どうやっても出てくるメインウィンドウを何とかする
Tkinterを初期化すれば必ずメインウィンドウが出てきます。
出てくるものは仕方が無いので最小化して隠します。
隠したうえでダイアログを開くのですが、コンソール画面の裏側にダイアログが出ると軽くパニックになります。下手をするとスクリプトを強制終了されかねない。
なので最前面に出てくるように指定をします。
ウィンドウを最小化する
root.state("iconic")
最前面に表示する
root.wm_attributes("-topmost", True)
後はダイアログを開いて、ファイルが選択されるなりダイアログが閉じられたタイミングでメインウィンドウを終了して、取得パスを返してやります。
なんだかほんのりダーティー風味な感じもしますけれどもこれで大丈夫!
もしも気に食わんって場合はデータクラスに保存してやる等すれば良いかと思いますよ。
コード
import tkinter as tk
import tkinter.filedialog as filedialog
# ファイル選択するためだけのクラス
class DirectDialog:
def __init__(self, root, kw={}, **kwargs):
root.wm_attributes("-topmost", True)
root.state("iconic")
self.root = root
def ascFile(self, **kwargs):
path = filedialog.askopenfilename(**kwargs)
self.root.destroy()
return path
# 呼び出し用ファンクション
def ascFile(**kwargs):
root = tk.Tk()
dd = DirectDialog(root)
filepath = dd.ascFile(**kwargs)
root.mainloop()
return filepath
if __name__ == "__main__":
print("普通のコンソールアプリケーション")
print("ファイルの選択をGUIで行いたい")
print("テキストファイルを選んでね")
# ここでファイルを選びたいのでファンクションを呼び出す。
# パラメータはaskopenfilenameのものがすべて適用可能(と思う)
filepath = ascFile(title="ファイル選択してね", filetype=[("テキストファイル", "*.txt")])
# ファイルが選ばれなかった場合 "" が返るのでチェックする。
if filepath != "":
print("選んだファイルはコレですね", filepath)
else:
print("ファイル選択してくれないのね")
さて、どうでしょうか。
便利な人には便利ですね!
わたしにも無茶苦茶便利です。みんなでニコニコ楽々業務です。
さあ、どんどん手を抜いていこう。
では良き楽々素敵なPythonライフを!