使用wait_variable与after循环的Tkinter应用如何实现干净退出
Tkinter 绑定
wait_variable步进场景下无法干净退出问题 问题场景
问题变体涉及使用按钮绑定wait_variable控制应用“步进前进”,同时需要支持应用干净退出,原始代码如下:
# 如需查看无缓冲输出,执行命令:python -u delete_win_test.py import tkinter as tk from tkinter import * class GUI(Tk): def __init__(self): super().__init__() # 点击窗口右上角关闭键时触发退出逻辑 self.protocol("WM_DELETE_WINDOW", self.closing) # 该变量设为1时,步进逻辑可以继续执行 self.var = tk.IntVar() # 点击Exit按钮关闭应用 button = tk.Button(self, text="Exit", command=self.destroy) button.place(relx=.5, rely=.5, anchor="c") # 步进按钮 self.step_button = tk.Button(self, text="Step", command=lambda: self.var.set(1)) self.step_button.place(relx=.5, rely=.75, anchor="c") def move(self): print("doing stuff") # 模拟业务逻辑执行 self.step_button.wait_variable(self.var) self.after(0, self.move) def closing(self): self.destroy() app = GUI() app.move() app.mainloop()
现有表现
- 窗口正常显示
- 步进功能正常,点击Step按钮终端会打印“doing stuff”
- 点击窗口右上角X或Exit按钮均可关闭窗口
存在问题
Python应用不会从终端退出,需要手动关闭终端,需要实现Python程序干净退出,无需用户关闭再重新打开终端。
解决方案
修改两处代码即可:
- 将Exit按钮的触发回调从
self.destroy改为self.closing - 在
closing方法中销毁窗口后,先给等待的变量赋值解除阻塞,再调用exit退出程序
修改后的代码片段如下:
# 点击Exit按钮关闭应用 button = tk.Button(self, text="Exit", - command=self.destroy) + command=self.closing) button.place(relx=.5, rely=.5, anchor="c") # 步进按钮 ... def closing(self): self.destroy() + self.var.set("") + exit(0)
该方案支持点击窗口原生X和Tk自定义按钮关闭窗口,同时可让终端中的Python应用干净退出。
内容的提问来源于stack exchange,提问作者kecklabs
相关产品推荐
相关产品推荐

