Jupyter notebook运行tkinter应选用quit/exit/sys.exit/os._exit哪种退出方式?
解决方案
首先你需求的本质是终止当前回调函数的后续逻辑执行,而非退出整个Python进程,直接在对应if分支末尾加return即可,完全符合你「不关闭tkinter窗口、不执行后续代码、无异常报错」的要求。
修改后的核心代码如下:
def routine (): x = 0 if x < 1: print("Hi") return # 直接终止当前函数执行,后续代码全部不会运行 # 下面的代码在x<1的情况下永远不会执行 if x > 1: print("bye...")
原有方法异常原因说明
你之前测试的4种方法本质都是退出Python进程的指令,出现异常完全符合预期:
quit()/exit():为交互式Python环境设计的进程退出指令,Jupyter的代码运行内核本身就是Python进程,调用后内核会直接终止,所以会弹出内核崩溃提示,和tkinter无关。sys.exit():本质是抛出SystemExit异常,tkinter的事件循环捕获到未处理的进程退出异常后会直接阻塞,导致窗口无响应、无法关闭。os._exit():属于强制硬杀进程的底层接口,必须传入状态码参数(比如os._exit(0)),就算参数正确调用后也会直接关闭整个程序,完全不符合你的需求。
相关疑问解答
- 会不会引发问题甚至安全威胁?
你遇到的非预期输出全部是「调用进程退出指令」导致的,换成return方案后不会产生任何异常输出。如果你的分支用于密码校验场景,return是最稳妥的方案:会直接终止当前函数的后续逻辑,不存在分支穿透的风险。如果继续用原有的进程退出方案,反而可能因为异常捕获逻辑的疏漏,出现后续敏感逻辑被执行的安全隐患。 - 编译为exe后会不会还有影响?
如果继续使用quit()/exit()等进程退出指令,编译为exe后不会出现Jupyter的内核崩溃提示,但会直接关闭整个tkinter程序,依然不符合你「不关闭窗口」的需求。换成return方案后,编译为exe也完全正常运行,无任何异常提示。
内容的提问来源于stack exchange,提问作者egghead jr
相关产品推荐
相关产品推荐

