Здание Ткинтера windows аналогично Root - PullRequest
1 голос
/ 12 января 2020

Я сейчас работаю над кодами Tkinter. Мне нужно создать новый windows точно такой же, как root, но мои коды работают не совсем хорошо. Название не появляется на новом windows. Это выдержка:

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()

1 Ответ

3 голосов
/ 12 января 2020

Как и в комментариях, Toplevel это путь к go для этого. Что я изменил:

  1. Перемещено для создания объекта window глобально

  2. Переименована функция, чтобы сделать ее makeWindow(master)

  3. makeWindow(master) теперь принимает главный виджет. Это сделает все виджеты частью главного окна.

  4. New_page был изменен, чтобы сделать новый виджет Toplevel ()

  5. 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...