Python tkinter中如何实现窗口关闭指定时长后自动打开另一窗口
tkinter实现窗口关闭后定时打开新窗口的方法
核心前提:tkinter的after()调度完全依赖主事件循环运行,只要不终止主事件循环,完全可以在关闭窗口的逻辑里追加定时打开新窗口的调度,不需要额外引入其他库。
实现要点
- 整个程序全程只保留1个
Tk()根实例,主事件循环mainloop()从程序启动到退出只运行一次,不要中途退出 - 其他所有业务窗口全部用
Toplevel()组件创建,关闭窗口时只销毁当前Toplevel实例,不要销毁根实例、不要退出主事件循环 - 在当前窗口的关闭逻辑(不管是用户点叉关闭,还是你已经实现的定时自动关闭)里,调用根实例的
after()方法,传入你要间隔的时长、以及下一个窗口的打开函数即可
可直接运行的示例代码
下面的示例实现了:第一个窗口3秒自动关闭,关闭后间隔2秒自动弹出第二个窗口,间隔时长和自动关闭时长可以自行修改参数:
import tkinter as tk from tkinter import ttk # 初始化全局唯一根窗口,启动后先隐藏避免出现空白默认窗 root = tk.Tk() root.withdraw() # 配置项:窗口关闭后到打开下一个窗口的间隔时长,单位毫秒 OPEN_NEXT_DELAY = 2000 # 配置项:第一个窗口自动关闭的时长,单位毫秒 FIRST_WIN_AUTO_CLOSE_DELAY = 3000 def open_first_window(): win1 = tk.Toplevel(root) win1.title("第一窗口") ttk.Label(win1, text="第一个窗口,将在3秒后自动关闭").pack(padx=30, pady=30) # 已实现的定时关闭逻辑,关闭时绑定打开下一个窗口的调度 win1.after( FIRST_WIN_AUTO_CLOSE_DELAY, lambda: close_win_and_schedule_next(win1, open_second_window) ) def open_second_window(): win2 = tk.Toplevel(root) win2.title("第二窗口") ttk.Label(win2, text="这是间隔2秒后自动打开的第二个窗口").pack(padx=30, pady=30) def close_win_and_schedule_next(current_win, next_window_func): # 销毁当前窗口 current_win.destroy() # 间隔指定时长后打开下一个窗口 root.after(OPEN_NEXT_DELAY, next_window_func) # 程序入口:打开第一个窗口,启动主事件循环 open_first_window() root.mainloop()
扩展说明
- 如果需要做3个及以上窗口串行弹出,只需要把所有窗口的打开函数按顺序存到列表里,每次关闭当前窗口时取下一个函数传给调度逻辑即可,不用重复写冗余代码
- 如果要支持用户手动点窗口右上角的叉关闭后也触发定时开下一个窗口的逻辑,可以给对应窗口绑定
WM_DELETE_WINDOW协议,把关闭逻辑指向上面的close_win_and_schedule_next函数即可 - 不要为每个窗口单独创建
Tk()实例,多Tk实例会导致事件循环混乱、资源冲突,after调度大概率失效,还会出现很多不可预期的样式、交互bug
内容的提问来源于stack exchange,提问作者Jaheen
相关产品推荐
相关产品推荐

