tkinter.filedialog 调用两次导致 macOS 崩溃

tkinter.filedialog calling twice cause crashing on macOS

下面是我的代码:

from tkinter import filedialog
path_1 = filedialog.askdirectory()
path_2 = filedialog.askdirectory()

我正在尝试多次调用 filedialog.askdirectory()。我可以 运行 Windows 中的上述代码没有任何问题。但是当我在 macOS 中执行此操作时,Python 会在我第二次调用该函数后崩溃(如果只调用一次就可以)。崩溃信息如下:

Process finished with exit code 139 (interrupted by signal 11: SIGSEGV)

其实我原来的实现是这样的(因为我发现大多数人都是这样的):

import tkinter as tk
from tkinter import filedialog

root = tk.Tk()
root.withdraw()
path_1 = filedialog.askdirectory(parent=root)
path_2 = filedialog.askdirectory(parent=root)
root.destroy()

这种实现方式在 macOS 中不会导致任何崩溃。但是有一个错误, root 无法正确销毁。问题如这个问题所述:tkinter gui hangups/freezes after destroy() on macOS。在 root.destroy() 之后会留下一个没有响应的 window,名为 'Tk'。因此,我尝试直接使用filedialog.askdirectory()而不使用root。以上两种方式在 Windows 中都可以正常工作,但在 macOS 中却不行。

这是我的 macOS 环境的一些细节:

我应该如何编写代码以在 macOS 上多次调用 filedialog.askdirectory(),而不触发上述错误?

经过多次尝试,我有点解决了这个问题。这是我的代码:

import tkinter as tk
from tkinter import filedialog

root = tk.Tk()
root.withdraw()
path_1 = filedialog.askdirectory()
path_2 = filedialog.askdirectory()

以上代码在 macOS 上不会产生任何崩溃或无响应 windows。我发现不需要做root.destroy()。而且,不将 root 作为 parent 参数传递给 filedialog.askdirectory(),可以防止 Tk window 在文件对话框 window 后面显示。希望这个解决方案可以帮助那些和我有同样问题的人。

但是,我仍然不太明白为什么我可以直接在Windows上调用filedialog.askdirectory(),多次没有任何问题;但在 macOS 上,我必须先调用 tk.Tk()withdraw() 以防止崩溃。如果有人知道答案,请告诉我。