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 环境的一些细节:
- Python 3.10.4
- tkinter 8.6
- macOS 12.3.1
- arm64 M1
我应该如何编写代码以在 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()
以防止崩溃。如果有人知道答案,请告诉我。
下面是我的代码:
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 环境的一些细节:
- Python 3.10.4
- tkinter 8.6
- macOS 12.3.1
- arm64 M1
我应该如何编写代码以在 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()
以防止崩溃。如果有人知道答案,请告诉我。