See if this makes more sense. It also runs without errors.
import sys if 3 == sys.version_info[0]: ## 3.X is default if dual system import tkinter as tk ## Python 3.x from tkinter import ttk else: import Tkinter as tk ## Python 2.x import ttk class MainWindow(): def __init__(self, parent): self.parent=parent self.fr=ttk.Frame(parent) self.fr.grid(column=0, row=0, sticky='nsew') self.fr.columnconfigure(0, weight=1) self.fr.rowconfigure(0, weight=1) self.mem_exists = tk.StringVar() self.reg_scan = tk.StringVar() self.sub_win=None self.widgets() def delete_dmps(self): if self.sub_win: self.sub_win.destroy() def widgets(self): self.mem_labl1 = ttk.Label(self.fr, text='Memory Dumps:') self.mem_labl1.grid(column=0, row=0) self.mem_labl2 = ttk.Label(self.fr, textvariable=self.mem_exists) self.mem_labl2.grid(column=0, row=1) self.mem_buton = ttk.Button(self.fr, text='Delete', command=self.delete_dmps) self.mem_buton.grid(column=0, row=2) self.dmp_separ = ttk.Separator(self.fr, orient='horizontal') self.dmp_separ.grid(column=0, row=3, rowspan=1, sticky=('EW')) self.scn_labl1 = ttk.Label(self.fr, text='Scan for Dumps') self.scn_labl1.grid(column=0, row=4) self.scn_buton = ttk.Button(self.fr, text='Scan', command=self.scan_pressed) self.scn_buton.grid(column=0, row=5) self.vrt_separ = ttk.Separator(self.fr, orient='vertical') self.vrt_separ.grid(column=1, row=0, rowspan=6, sticky=('NS')) self.reg_labl1 = ttk.Label(self.fr, text='Unneeded Keys') self.reg_labl1.grid(column=2, row=0) self.reg_labl2 = ttk.Label(self.fr, textvariable=self.reg_scan) self.reg_labl2.grid(column=2, row=1) ## self.reg_buton = ttk.Button(self.fr, text='Delete', command=self.delete_keys) ## self.reg_buton.grid(column=2, row=2) def scan_pressed(self): self.sub_win = tk.Toplevel(self.parent) ##<----- ERROR HERE ## self.write_dumps() ## size = self.get_size() ## self.mem_exists.set(f'{size} KB of memory dumps found!') root=tk.Tk() MW=MainWindow(root) root.mainloop()