Как сделать так ,чтобы кнопка открывала новое окно и закрывала текущее?
У меня есть кнопка "btn_open_dialog" которая открывает дочернее окно Child.Как можно сделать так,чтобы при этом она закрывала текущее окно Main?
from tkinter import ttk
from tkinter.constants import CENTER, NW, W
from tkinter.font import BOLD
import pip
from plyer import notification
class Main(tk.Frame):
def __init__(self,root):
super().__init__(root)
self.init_main()
def init_main(self):
toolbar=tk.Frame(bg="white",bd=2)
toolbar.pack(side=tk.TOP,fill=tk.X)
self.add_img=tk.PhotoImage(file="23.gif")
self.add_img2=tk.PhotoImage(file="36.gif")
btn_open_dialog=tk.Button(toolbar,text="Создать напоминание-уведомление",command=self.cb,bg="white",bd=1,compound=tk.TOP,image=self.add_img)
btn_open_dialog.pack(side=tk.LEFT)
def cb(self):
Child()
class Child(tk.Toplevel):
def __init__(self):
super().__init__(root)
self.init_child()
def init_child(self):
self.title("Создать напоминание-уведомление")
self.geometry("800x600")
self.config(bg="#CCFFFF")
label_title=tk.Label(self,text="Введите название",bg="#CCFFFF")
label_title.place(x=100,y=10)
label_entry=tk.Label(self,text="Введите текст",bg="#CCFFFF")
label_entry.place(x=100,y=80)
entry_title=ttk.Entry(self)
entry_title.place(x=200,y=10)
entry_message=ttk.Entry(self)
entry_message.place(x=200,y=80)
btn_make_noti=tk.Button(self,text="Создать уведомление",command=lambda:self.make_noti(entry_title,entry_message))
btn_make_noti.place(x=200,y=150)
def make_noti(self,entry_title,entry_message,):
notification.notify(title=entry_title.get(),
message= entry_message.get(),
app_icon ="icon.ico",
timeout=15,
toast=False)
if __name__=="__main__" :
root =tk.Tk()
app=Main(root)
app.pack()
root.title("Reminder app")
root.config(bg="#CCFFFF")
root.geometry("800x600")
root.mainloop()
Ответы (1 шт):
Чтобы убрать (спрятать) окно с экрана, но при этом не уничтожать (что актуально для главного окна, т.к. при его уничтожении приложение завершит свою работу), надо использовать метод withdraw() этого окна. Например:
import Tkinter as tk
root = tk.Tk()
root.withdraw()
Чтобы снова вернуть видимость этому окну используйте метод deiconify() (или wm_deiconify()).
root.deiconify()
Если окно больше не нужно, то вызовите метод destroy(). Это уничтожит окно со всеми принадлежащими ему виджетами. Учтите, что уничтожение главного окна приведёт к завершению приложения.
root.destroy()
Соответственно, в вашем случае вам при открытии дочернего окна надо спрятать главное окно. А при закрытии дочернего окна либо вернуть главное окно (иначе процесс останется, но ни одного окна у него не будет, так что придётся убивать процесс через Диспетчер задач, или командой kill). Либо уничтожить главное окно, чтобы выйти из программы.
Ну и код (см. комментарии в нём):
import tkinter as tk
from tkinter import ttk
from plyer import notification
class Main(tk.Frame):
def __init__(self, root):
super().__init__(root)
self.root = root # << сохраняем ссылку на главное окно
self.init_main()
def init_main(self):
toolbar=tk.Frame(self.root, bg="white", bd=2) # << Frame порождаем от главного окна
toolbar.pack(side=tk.TOP, fill=tk.X)
self.add_img = tk.PhotoImage(file="23.gif")
self.add_img2 = tk.PhotoImage(file="36.gif")
btn_open_dialog = tk.Button(toolbar, text="Создать напоминание-уведомление",
command=self.cb, bg="white", bd=1, compound=tk.TOP,
image=self.add_img)
btn_open_dialog.pack(side=tk.LEFT)
def cb(self):
Child(self.root) # << передаём ссылку на главное окно
class Child(tk.Toplevel):
def __init__(self, parent):
super().__init__(parent)
self.parent = parent # << сохраняем ссылку на родительское окно
self.init_child()
# vv перехватываем кнопку закрытия окна чтобы вернуть назад родительское окно
self.protocol("WM_DELETE_WINDOW", lambda: (parent.deiconify(), self.destroy()))
parent.withdraw() # << прячем родительское окно
def init_child(self):
self.title("Создать напоминание-уведомление")
self.geometry("800x600")
self.config(bg="#CCFFFF")
label_title = tk.Label(self, text="Введите название", bg="#CCFFFF")
label_title.place(x=100, y=10)
label_entry = tk.Label(self, text="Введите текст", bg="#CCFFFF")
label_entry.place(x=100, y=80)
entry_title = ttk.Entry(self)
entry_title.place(x=200, y=10)
entry_message = ttk.Entry(self)
entry_message.place(x=200, y=80)
btn_make_noti = tk.Button(self, text="Создать уведомление",
command=lambda:self.make_noti(entry_title,entry_message))
btn_make_noti.place(x=200,y=150)
def make_noti(self,entry_title,entry_message,):
notification.notify(title=entry_title.get(),
message=entry_message.get(),
app_icon ="icon.ico",
timeout=15,
toast=False)
if __name__=="__main__" :
root =tk.Tk()
app=Main(root)
app.pack()
root.title("Reminder app")
root.config(bg="#CCFFFF")
root.geometry("800x600")
root.mainloop()