Как и в комментариях, Toplevel
это путь к go для этого. Что я изменил:
Перемещено для создания объекта window
глобально
Переименована функция, чтобы сделать ее makeWindow(master)
makeWindow(master)
теперь принимает главный виджет. Это сделает все виджеты частью главного окна.
New_page
был изменен, чтобы сделать новый виджет Toplevel ()
TITLE_FRAME
теперь выполняется первым, а затем вызывается сетка
(РЕДАКТИРОВАТЬ) Эти правки исправляют проблемы с исходным окном, закрывающим программу.
Мы хотим переназначить закрывающее поведение, чтобы действовать так, как мы хотим. Это сделано с window.protocol("WM_DELETE_WINDOW",callback)
. Мы должны определить функцию обратного вызова, в данном случае, deleteWindow(win)
.
То, что делает окно удаления, - это берет окно, и если это окно root, оно его скрывает. В противном случае он удаляет окно. Я использовал window.withdraw()
в своем коде, но, вероятно, есть лучший способ сделать это.
То, как он должен закрывать программу, - это отслеживание количества активных windows в переменной activeWindows
. Когда окно создано, число увеличивается, при удалении оно уменьшается. Если число активных windows равно 0, мы можем удалить главное окно, чтобы аккуратно закрыть программу.
Способ связывания обратного вызова deleteWindow(win)
осуществляется через анонимную функцию. Обычно протокол, упомянутый выше, не дает никаких аргументов, но мы хотим знать, какое окно вызвало функцию. Чтобы сделать это, всякий раз, когда мы связываем уничтожение окна, мы определяем анонимную функцию, используя лямбду, которая вызывает deleteWindow
.
.
from tkinter import *
window = Tk()
window.resizable(0,0)
window.configure(background='grey')
window.state('zoomed')
window.geometry("2000x4000")
activeWindows = 1
def deleteWindow(win):
if win == window:
window.withdraw()
else:
win.destroy()
global activeWindows
activeWindows-=1
if activeWindows <= 0:
window.destroy()
#New Window
def New_page():
global activeWindows
activeWindows+=1
NEW_WINDOW=Toplevel(background='grey')
NEW_WINDOW.geometry("2000x4000")
NEW_WINDOW.protocol("WM_DELETE_WINDOW",lambda:deleteWindow(NEW_WINDOW))
makeWindow(NEW_WINDOW)
#Main Window
def makeWindow(master):
#Title Frame
TITLE_FRAME = Frame(master, relief = GROOVE, bg = "black", width=2000, height=160)
TITLE_FRAME.grid(row=0, column=0, columnspan = 150, rowspan = 30, sticky=E+W)
Label(TITLE_FRAME, text= 'THIS IS THE TITLE PART', fg='sky blue', bg='black', font='none 40 bold',
borderwidth=5).grid(row=0,column=10)
#New Window Button
ENTRY_FRAME = Frame(master, bg='sky blue', relief = SUNKEN)
ENTRY_FRAME.grid(row=40, column=0, columnspan=20, padx=15, pady=15)
Label(ENTRY_FRAME, text= 'SELECT THE APPROPRIATE DETAILS:',
bg = 'sky blue', fg='black', font='none 10 bold', borderwidth=5).grid(row=0, column=0, columnspan=20)
NEW_WINDOW = Button(ENTRY_FRAME, text="NEW WINDOW", font='None 8 bold', width=30, command=New_page, fg= 'black', bg='white')
NEW_WINDOW.grid(row = 3, column = 0, columnspan = 3, padx = 10, pady = 10)
window.protocol("WM_DELETE_WINDOW",lambda: deleteWindow(window))
#Calling the Tkinter function
makeWindow(window)
window.mainloop()