tkinter判断窗口是否存在,只允许存在一个子窗口

本文探讨如何在Python Tkinter中避免创建多个子窗口,通过使用`protocol`函数管理和关闭行为,确保始终只有一个活动子窗口。学习如何设置窗口关闭事件和防止重复创建窗口的技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 引入

很多时候我们需要在一个python里面创建子窗口来实现一定目的,但出于疏忽忘记窗口会被多次创建,使程序在使用某一函数时造成程序bug如下

import tkinter as tk
def window_1():
    window_sign_up_11 = tk.Toplevel(window)

window = tk.Tk()
b = tk.Button(window, text='创建子窗口', font=('Arial', 12), width=10, height=1,
command=window_1)

b.pack()
window.mainloop()

尝试运行我们会发现点击多少次按钮就会有多少个子窗口,但为了符合实际要求我们只需要一个窗口,并且只允许存在一个子窗口怎么做呢?

方法

首先介绍一个tkinter中的函数

protocol

这个函数是干什么的?我们都知道当windows关闭窗口是点击窗口右上角的关闭按钮(小×)

这个在tkinter中就是唤醒这个protocol

函数默认是关闭这个窗口,我们可以改一下,用法如下:

import tkinter as tk
import tkinter.messagebox
class this_main(object):
    def __init__(self):
        self.window_1_true = None
    def window_2(self):
        self.window_1_true = None
        self.window_1.destroy()
    def window_1(self):
        if self.window_1_true == None:
            self.window_1 = tk.Toplevel(window)
            self.window_1_true = True
            self.window_1.protocol('WM_DELETE_WINDOW',this_main.window_2)
            self.window_1.mainloop()

        else:
            tkinter.messagebox.showwarning(title='警告', message='不可以创建两个子窗口!')
if __name__ == '__main__':
    this_main = this_main()
    window = tk.Tk()
    b = tk.Button(window, text='创建子窗口', font=('Arial', 12), width=10, height=1,
command=this_main.window_1)

    b.pack()
    window.mainloop()

函数用法

窗口名.protocol('WM_DELETE_WINDOW',被关闭时执行函数名)

现在我们解释上面的代码大概是这个意思:

1.创建变量 初始值为None

2.如果变量值为None,创建窗口,同时定义变量值为True,带表已经有窗口

如果不为None警告:不可创建两个窗口

3.窗口关闭时执行函数,将变量值定为None代表没有窗口,可以继续创建,再关闭这个窗口

这样就实现了一个程序出现两个子窗口的问题

注意:记得在自己定义的函数里关闭已有窗口不然会出现关不掉的窗口这种问题

关闭窗口

窗口名.destroy()

扩展:利用bug做一个关不掉的窗口

import tkinter as tk
import tkinter.messagebox
def window_2():
    tkinter.messagebox.showwarning(title='警告', message='关不掉我,为什么要创建我呢?')
def window_1():
    window_sign_up_11 = tk.Toplevel(window)
    window_sign_up_11.protocol('WM_DELETE_WINDOW',window_2)
    window_sign_up_11.mainloop()

window = tk.Tk()
b = tk.Button(window, text='创建子窗口', font=('Arial', 12), width=10, height=1,
command=window_1)

b.pack()
window.mainloop()

tkinter学习推荐博主:tinga_kilin的博客_Smart-Space_CSDN博客-Tin标记语言,tkinter实验,TinUI领域博主

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

beginner2021

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值