You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何点击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!")

问题分析

  1. 原代码中added方法仅弹出提示框,未执行关闭子窗口的逻辑;
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 15:01:01