如何点击Toplevel窗口内按钮后关闭该窗口并弹出提示框
问题需求
点击主窗口按钮弹出Toplevel子窗口后,点击子窗口内的按钮时,要求子窗口立即关闭,同时弹出提示框,而非当前子窗口仍停留在界面上的状态。
原代码
import tkinter as tk import tkinter.messagebox class Test(): def __init__(self): self.root = tk.Tk() self.root.geometry("500x400") self.b1 = tk.Button(self.root, width=11, text="btn1", font=('Satoshi', 15),command=self.add).pack(padx=10, pady=10) self.root.mainloop() def add(self): extra = tk.Toplevel(self.root) extra.geometry("500x200") button = tk.Button(extra, text="btn1", font=('Satoshi', 15), command=self.added).pack() def added(self): tkinter.messagebox.showinfo("test", "button pressed succesfully!")
问题分析
- 原代码中
added方法仅弹出提示框,未执行关闭子窗口的逻辑; add方法里的extra是局部变量,added方法无法直接访问到这个子窗口对象,没法调用destroy()关闭它。
解决方案
方法一:将子窗口设为实例属性
把extra赋值给类的实例属性,让added方法可以直接访问并关闭它:
import tkinter as tk import tkinter.messagebox class Test(): def __init__(self): self.root = tk.Tk() self.root.geometry("500x400") # 注意:pack()返回None,需拆分按钮创建与布局代码,避免self.b1变成None self.b1 = tk.Button(self.root, width=11, text="btn1", font=('Satoshi', 15), command=self.add) self.b1.pack(padx=10, pady=10) self.root.mainloop() def add(self): # 将子窗口设为实例属性,供added方法调用 self.extra = tk.Toplevel(self.root) self.extra.geometry("500x200") button = tk.Button(self.extra, text="btn1", font=('Satoshi', 15), command=self.added) button.pack() def added(self): # 先关闭子窗口 self.extra.destroy() # 再弹出提示框 tkinter.messagebox.showinfo("test", "button pressed succesfully!")
方法二:通过lambda传递子窗口对象
无需修改实例属性,直接在绑定按钮命令时,用lambda把子窗口对象传给added方法:
import tkinter as tk import tkinter.messagebox class Test(): def __init__(self): self.root = tk.Tk() self.root.geometry("500x400") self.b1 = tk.Button(self.root, width=11, text="btn1", font=('Satoshi', 15), command=self.add) self.b1.pack(padx=10, pady=10) self.root.mainloop() def add(self): extra = tk.Toplevel(self.root) extra.geometry("500x200") # 用lambda把extra作为参数传给added方法 button = tk.Button(extra, text="btn1", font=('Satoshi', 15), command=lambda: self.added(extra)) button.pack() def added(self, window): # 关闭传入的子窗口 window.destroy() tkinter.messagebox.showinfo("test", "button pressed succesfully!")
内容的提问来源于stack exchange,提问作者salierii
相关产品推荐
相关产品推荐

