Search on blog:

Tkinter: jak otworzyć tylko jedno okno Toplevel

Aby mieć tylko jedno okno Toplevel można zablokować przycisk, który otwiera to okno Toplevel i odblokować przycisk gdy to okno jest zamykane.

Można do tego użyć button['state'] i ustawiać 'disable' lub 'normal'

Potrzebne też jest window.protocol("WM_DELETE_WINDOW", function) do wywołania funkcji gdy zostani wciśnięty przycisk [X] zamykający okno.

import tkinter as tk  # PEP8: `import *` is not preferred

# --- functions ---

def close_top():

    single_top.destroy()

    b['state'] = 'normal'

def open_top():
    global single_top

    b['state'] = 'disable'

    single_top = tk.Toplevel(root)
    l = tk.Label(single_top, text='TopLevel')
    l.pack()
    single_top.protocol("WM_DELETE_WINDOW", close_top)  # assign to closing button [X]

# --- main ---

root = tk.Tk()

b = tk.Button(root, text='TOP', command=open_top)
b.pack()

root.mainloop()

Inna metodą jest stworzenie globalnej zmiennej dla okna Toplevel i przypisanie None na starcie. Gdy przycisk zostanie wciśnięty to wtedy okno należy stworzyć tylko gdy ta zmienna wciąż jest None a następnie przypisać okno do tej zmiennej i dzięki temu następnym razem już nie będzie None. Gdy okno Toplevel jest zamykane wtedy ponownie trzeba ustawić tą zmienną na None

Ta metoda może być użyta na wiele różnych obiektów (nie tylko w GUI) - np. może być użyta w grze do posiadania tylko jednego aktywnego strzału.

Ta metoda może być użyta także z list i len() to posiadania kilku okein - np. zawsze nie więcej niż 3 okna.

import tkinter as tk  # PEP8: `import *` is not preferred

# --- functions ---

def close_top():
    global single_top

    single_top.destroy()
    single_top = None

def open_top():
    global single_top

    if single_top is None:
        single_top = tk.Toplevel(root)
        l = tk.Label(single_top, text='TopLevel')
        l.pack()
        single_top.protocol("WM_DELETE_WINDOW", close_top)  # assign to closing button [X]
    else:
        print("Toplevel already exists")

# --- main ---

single_top = None

root = tk.Tk()

b = tk.Button(root, text='TOP', command=open_top)
b.pack()

root.mainloop()

Notatki:

Stackoverflow: Open only one Tk.Toplevel window

If you like it
Buy a Coffee