我目前正在处理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/

10-14 17:36