LoginSignup
1
3

More than 3 years have passed since last update.

Tkinterのfiledialogでキャンセルするとエラーになる対策

Last updated at Posted at 2019-11-26

動作環境

Windows10
PyCharm
Python3

起こった現象

tkinter.filedialog.askopenfilename でダイアログを開いた際に、キャンセルを押すとエラーになって、そのままPyCharmが不安定になってします。OSの再起動を何度かやりました。

コード

import tkinter.filedialog
import os
import sys

root = tkinter.Tk()
file_type = [("", "*")]
current_dir = os.getcwd()
root.withdraw()
file_name = tkinter.filedialog.askopenfilename(filetypes=file_type, initialdir=current_dir)
if file_name == "":
    sys.exit(1)
current_dir = current_dir.rsplit("\\", 1)[1]
file = "." + file_name.split(current_dir)[1]
print(file)

キャンセルした際に、if file_name == "" の条件に一致して、sys.exit(1)が実行されます。
これをやらないと、キャンセルをした際に、エラーになります。if文をコメントアウトして確認してみて下さい。

追記)半年ぶりにこのページを見て↑のコードを何故載せたのか分からなくなりましたが、↓のコードで書いているように return "break" をすれば、エラーは出なくなります

インスタンスメソッドの場合の例

    # クラス内のインスタンスメソッドです。
    # ボタンを押した際に、ファイルダイアログが開くメソッドの例です。
    def button_action_hoge(self, event):
        file_type = [("", "*")]
        current_dir = os.getcwd()
        file_name = tkinter.filedialog.askopenfilename(
            filetypes=file_type, initialdir=current_dir)
        if file_name == "":
            return "break"
        current_dir = current_dir.rsplit("\\", 1)[1]
        # file = fileName.split(current_dir)[1]

        # file = g_init_data.pathImageFolder + fileName.split(currentDir)[1]
        file = "." + file_name.split(current_dir)[1]
        return "break"

return "break"の""はボタンの表示が元の状態に戻る魔法のおまじないです。
if file_name == "" のところがないと、PyCharmが固まってしまうくらいの状態になります。

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3