Python使用Tkinter实现两次用户交互的脚本多次执行卡顿问题
问题原因
- 核心问题是同一个进程内创建了多个
Tk()根窗口实例,且Tkinter上下文在Spyder控制台这种不退出进程的运行环境中存在状态残留:GetDate()函数内创建了第一个Tk()实例,调用destroy()仅销毁了窗口对象,Tkinter全局上下文仍残留旧实例状态- 调用
askopenfilename前又创建了第二个Tk()实例,多实例的状态在第二次运行时发生冲突,导致root.mainloop()卡住
- 移除文件选择逻辑后不再创建第二个
Tk()实例,因此不会出现冲突,可多次运行。
修复方案
全程仅创建一个Tk()根窗口实例,复用该实例完成两次交互,所有交互完成后再销毁根窗口。修改后的参考代码如下:
import tkinter as tk from tkinter.filedialog import askopenfilename def GetDate(root): date = None def my_function(): nonlocal date date = my_entry.get() # 仅清空当前窗口组件,不销毁根窗口 for widget in root.winfo_children(): widget.destroy() root.quit() # 退出当前mainloop,保留根窗口供后续使用 my_label = tk.Label(root, text = "Enter date (YYYYMMDD): ") my_label.grid(row = 0, column = 0) my_entry = tk.Entry(root) my_entry.grid(row = 0, column = 1) my_button = tk.Button(root, text = "Submit", command = my_function) my_button.grid(row = 1, column = 1) root.mainloop() return date # 全局仅创建一次根窗口 root = tk.Tk() date = GetDate(root) # 复用已有根窗口弹出文件选择框,无需新建 root.withdraw() filenameDat = askopenfilename(initialdir = dayfold, filetypes=[("Dat", "*.xls*")], title = 'Open Input File') # 所有交互完成后再销毁根窗口 root.destroy()
- 去掉了全局变量
date,改用函数返回值传递输入结果,避免全局状态残留 - 全程仅创建一个
Tk()实例,从根源避免多实例冲突问题
内容的提问来源于stack exchange,提问作者Fadri
相关产品推荐
相关产品推荐

