Tcl_AsyncDelete: async handler deleted by the wrong thread

In my GUI windows are not deleted by different threads, it’s just that the loading screen runs on a different thread. It repeatedly checks a variable outside the thread to choose whether to terminate or not, whenever the loading screen terminates nothing happens but when I close the main window from main thread, then this error comes(note that when I close the main window, the loading screen terminated long ago). Why is this happening? Here’s my code:

from tkinter import *
from tkinter.font import Font
from threading import Thread
from datetime import datetime, date
import os



login = os.getlogin()
loaded = False
bg = "#17191c"



def load():

	load = Tk()

	load.config(bg = bg)

	load.state("zoomed")

	dimensions = (load.winfo_height(), load.winfo_width())
	load.state("normal")

	load.overrideredirect(True)
	load.geometry("517x357+" + str(dimensions[0]//2) + "+" + str(dimensions[1]//2))


	Label(load, text = "Path finder", font = ("Sans Serif", 50), fg = "black", bg = bg).pack(anchor = "nw")
	Label(load, text = "Loading...", font = ("Sans Serif", 10), fg = "black", bg = bg).pack(anchor = "sw")

	def check():

		if loaded:

			load.destroy()

		else:

			load.after(1, check)


	check()


	load.mainloop()


load_thread = Thread(target = load)
load_thread.start()


root = Tk()

root.title("Path finder")
root.withdraw()



def disable():

	pass



class Setting:

	
	def __init__(self):

		settings = {}

		file = open("user-setting.setting", "r")
		self.file = file

		for pair in file.read().split("\n"):

			exec("settings.update({" + pair + "})")

		self.settings = settings

	
	def edit(self, setting, new_setting):

		self.settings[setting] = new_setting


	def reopen(self):

		self.file = open("user-setting.setting", "r")

	
	def save(self):

		self.file.close()
		file = open("user-setting.setting","w")

		for x in self.settings:

			file.write('"' + str(x) + '":"' + str(self.settings[x]) + '"\n')



try:
	
	
	settings = Setting()

	exec('settings.settings["geometry"] = ' + str(settings.settings["geometry"]))
	exec('settings.settings["mapcode"] = ' + str(settings.settings["mapcode"]))


	root.state(settings.settings["geometry"][0])
	root.geometry(settings.settings["geometry"][1])


except Exception as e:

	
	now = datetime.now()

	with open("C:\\Users\\" + login + "\\Desktop\\Path finder\\logs\\log-" + str(now.strftime("%d-%m-%Y")) + "&" + str(now.strftime("%H-%M-%S")), "w")as f:

		f.write(str(e))	


	os.startfile("backup.pyw")

	exit()



def save():

	settings.settings["geometry"][0] = root.state()
	settings.settings["geometry"][1] = root.geometry()
	
	settings.save()

	root.destroy()


root.protocol("WM_DELETE_WINDOW", save)

grid_frame = Frame(root, bg = bg)
ribbon = Frame(root, height = 70, bg = "#0b0b0d")

ribbon.pack(fill = "x", side = "top")
grid_frame.pack(fill = "both", expand = True)


for x in range(0,720):

    exec('\ncell'+str(x)+' = Label(grid_frame, bg = bg, height = 2, width = 4)'+'\n\ncell'+str(x)+'.bind("<Enter>", lambda event: cell'+str(x)+'.config(bg = "#272a2e"))\ncell'+str(x)+'.bind("<Leave>", lambda event: cell'+str(x)+'.config(bg = bg))\n')


class Grid:

	def __init__(self):

		hover = None

		row = 1
		column = 1

		for x in range(0, 720):

			if column == 41:

				column = 1
				row += 1

			exec("cell" + str(x) + ".grid(row = " + str(row) + ", column = " + str(column) + ")")
			column += 1



grid = Grid()



loaded = True

root.deiconify()
root.mainloop()