Я считаю, что проблема в том, что вы создали второй цикл, чтобы исправить это, вы можете просто удалить второй цикл, и тогда функция .destroy()
будет работать нормально.
Как это
class MainWindow(tk.Frame):
def __init__():
# your init code
def new_element(self):
root = tk.Toplevel()
popup = Popup(root, 1, 0)
class Popup(tk.Frame):
def __init__(self, master, var1, var2):
# your init code
def foo(self, a, b):
self.master.destroy()
Еще один комментарий, который я сделаю, заключается в том, что я считаю, что то, как вы структурировали эти окна, вводит в заблуждение и может привести к путанице (имейте в виду, что это всего лишь предпочтение и больше не связано с «реальными» проблемами).
Я считаю, что вместо Popup(Frame)
класса вам следует создать Popup(Toplevel)
класс.
Как это
import tkinter as tk
class MainWindow(tk.Frame):
def __init__(self, master):
tk.Frame.__init__(self, master)
self.pack()
btn_new_element = tk.Button(self, text='new', command=self.new_element)
btn_new_element.pack()
self.master = master
self.pack()
def new_element(self):
popup = Popup(self.master, 1, 0)
class Popup(tk.Toplevel):
def __init__(self, master, var1, var2):
super().__init__(master)
#some widgets
btn = tk.Button(self, text='Enter', command=lambda a=var1, b=var2: self.foo(a,b))
btn.pack()
def foo(self, a, b):
self.destroy()
if __name__ == '__main__':
root = tk.Tk()
window = MainWindow(root)
root.mainloop()
Когда вы создаете элемент Toplevel, ему нужен мастер, мастер в этом случае будет главным окном. Когда вы используете self.destroy в классе Toplevel, вы не уничтожаете мастера Toplevels, а вместо этого уничтожаете сам Toplevel.