我目前正在处理Tkinter代码。我碰巧需要创建一个与root完全相似的新窗口,但是我的代码不能很好地工作。标题不会出现在新窗口中。这是节选:
from tkinter import *
#New Window
def New_page():
window()
#Main Window
def window():
window = Tk()
window.resizable(0,0)
window.configure(background='grey')
window.state('zoomed')
window.geometry("2000x4000")
#Title Frame
TITLE_FRAME = Frame(window, relief = GROOVE, bg = "black", width=2000, height=160).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(window, 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.mainloop()
#Calling the Tkinter function
window()
最佳答案
就像注释中一样,Toplevel
是实现此目标的方法。我改变了什么:
全局移动了window
对象
将函数重命名为makeWindow(master)
makeWindow(master)
现在加入一个主窗口小部件。这将使
所有的小部件都位于主窗口中。New_page
进行了修改,以制作一个新的Toplevel()小部件
现在首先创建TITLE_FRAME
,然后在其上调用grid
(编辑)这些编辑解决了原始窗口关闭程序的问题。
我们想重新映射结束行为以按照我们的意愿行事。这是通过window.protocol("WM_DELETE_WINDOW",callback)
完成的。我们必须定义回调函数,在这种情况下为deleteWindow(win)
。
删除窗口的作用是获取一个窗口,如果它是根窗口,则将其隐藏。否则,它将删除该窗口。我在代码中使用了window.withdraw()
,但可能有更好的方法。
知道是否应关闭程序的方法是通过跟踪activeWindows
变量中活动窗口的数量。创建窗口时,数量增加,而删除时数量减少。如果活动窗口的数量为0,我们可以删除主窗口以干净地关闭程序。
绑定deleteWindow(win)
回调的方法是通过匿名函数。通常,上面提到的协议不提供任何参数,但是我们想知道哪个窗口调用了该函数。为此,无论何时绑定窗口销毁,我们都使用lambda定义一个匿名函数,该函数调用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()
关于python - Tkinter建筑 window 类似于根,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59701108/