Python3.6 macOS下子进程运行Tkinter GUI崩溃问题求助
问题原因与解决方案
在macOS环境下用multiprocessing启动Tkinter GUI子进程崩溃,核心原因是macOS的进程模型和Tkinter依赖的UI框架冲突:
- Python 3.6在macOS上,
multiprocessing默认使用fork方式创建子进程。这种方式会直接复制父进程的内存空间,但不会复制Cocoa(macOS的UI框架)的线程上下文和相关资源。而Tkinter底层依赖Cocoa来渲染UI,fork出来的子进程没有完整的UI运行环境,直接启动Tkinter就会导致崩溃。
修复后的代码
把进程启动方式改为spawn,它会启动一个全新的Python进程,拥有独立的完整运行环境,能正常初始化Tkinter:
import multiprocessing as mp import tkinter as TK def RunGUI(): root = TK.Tk() root.title('Hello Child GUI') root.geometry('{}x{}+0+0'.format(768, 768)) root.resizable(width=False, height=False) root.attributes('-topmost', True) root.mainloop() if __name__ == '__main__': # 在macOS上强制使用spawn启动子进程 mp.set_start_method('spawn') job = [] p = mp.Process(target=RunGUI) job.append(p) p.start()
额外注意点
- 必须加上
if __name__ == '__main__':判断,这是spawn启动方式的要求,避免子进程重复执行主模块代码。 spawn方式的启动速度比fork慢一些,因为要重新初始化整个Python环境,但这是macOS上让Tkinter在子进程中运行的必要代价。- 如果你用的是Python 3.8及以上版本,macOS上
multiprocessing的默认启动方式已经改成了spawn,这种情况下可能不需要手动设置,但加上set_start_method也能确保兼容性。
内容的提问来源于stack exchange,提问作者kakyo
相关产品推荐
相关产品推荐

