引入
很多时候我们需要在一个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领域博主