Tkinter窗口关闭后进程未终止,多次操作需多次强制结束
问题解决:Tkinter窗口关闭后程序无法自动终止
问题根源
每次点击「Cambia file」按钮时,select_file()函数都会新建一个tkinter.Tk()实例,调用withdraw()只是隐藏窗口,并没有销毁这个实例。每点击一次就会产生一个后台运行的Tk实例,主窗口关闭后这些残留实例仍在运行,导致程序无法自动终止,需要多次按Ctrl+C才能结束进程。
解决方案
修改select_file()函数,避免残留未销毁的Tk实例,有两种可行方式:
方式一:复用主窗口作为文件对话框的父窗口
直接使用已创建的主窗口app作为文件对话框的父窗口,无需新建Tk实例:
def select_file(): folder_path = filedialog.askopenfilename(parent=app) return folder_path
方式二:创建临时窗口后主动销毁
如果必须创建临时窗口,使用后立即销毁该实例:
def select_file(): temp_root = tkinter.Tk() temp_root.withdraw() # 隐藏临时窗口 folder_path = filedialog.askopenfilename(parent=temp_root) temp_root.destroy() # 用完后销毁临时窗口 return folder_path
完整修改后的代码示例
import tkinter from tkinter import filedialog import os def check_path_file(): # 读取已保存的文件路径,不存在则返回空字符串 path = os.path.expanduser('~/Documents/Squad Generator/excel_file_path.txt') return open(path).read() if os.path.exists(path) else "" def main(): # 补充原代码中缺失的主逻辑实现 pass def select_file(): # 采用方式一:复用主窗口作为文件对话框父窗口 folder_path = filedialog.askopenfilename(parent=app) return folder_path def change_file(): file_path = select_file() if file_path: # 处理用户取消选择文件的情况 save_path = os.path.expanduser('~/Documents/Squad Generator/excel_file_path.txt') os.makedirs(os.path.dirname(save_path), exist_ok=True) # 确保保存目录存在 with open(save_path, 'w') as f: f.write(file_path) var.set(file_path) def homepage(): app.geometry("450x200") app.title("Squad Generator") label_1 = tkinter.Label(master=app, justify=tkinter.LEFT, textvariable=var, font=("JetBrains Mono", 15)) label_1.grid(row=0, column=0, columnspan=2, padx=20, pady=(20, 0), sticky="nsew") button1 = tkinter.Button(master=app, text="Continua", command=main) button1.grid(row=1, column=0, padx=20, pady=20, sticky="ew") button2 = tkinter.Button(master=app, command=change_file, text="Cambia file") button2.grid(row=1, column=1, padx=0, pady=20, sticky="ew") app.mainloop() if __name__ == '__main__': app = tkinter.Tk() var = tkinter.StringVar(None, check_path_file()) homepage()
内容的提问来源于stack exchange,提问作者emanuele pascale
相关产品推荐
相关产品推荐

