Как сделать так, чтобы окно в tkinter не открывалось больше 1 раза по нажатию на кнопку?

Помогите, пожалуйста. Хочу сделать так, чтобы нельзя было открывать окно, вызываемое кнопкой в tkinter, больше 1 раза. Извините, если код немного непонятный — я новичок.

Вот код:

from tkinter import *
import pyglet
import pyautogui as au
from time import *
import webbrowser as web
from PIL import *
from pygame.display import update
import random

au.FAILSAFE = False

# окно 1
win = Tk()
win.geometry('420x480')
win.title('Title')
win.config(background='Grey')
win.resizable(width=False, height=False)
win.update()
imgVK = PhotoImage(file='vkms.png')
imgVK = imgVK.subsample(8,8)

#функции
def click_audio():
    a = pyglet.resource.media("knopka-schelchok-korotkii-zvonkii-blizkii-suhoi1.mp3")
    a.play()
    update(mainloop())

    pyglet.app.run()

    return click_audio()

def off():
    au.click(24, 1064)
    sleep(0.01)
    au.click(315, 1015, 1)

def vk_music_open():
    def open_url(url):
        web.open(url)
    open_url("https://vk.com/audio")

    return open_url

# окно 2      #тут надо сделать чтобы это окно нельзя было открывать больше 1 раза пока его же не закроешь
def random_action():
    global win1
    win1 = Tk()
    win1.geometry("300x300")
    win1.title("что делать")
    win1.config(background="black")
    win1.resizable(width=False, height=False)
    win1.update()

    act = random.randint(1, 100)
    if act <= 50:
        label1 = Label(master=win1, text="Programming", font=("Comic Sans MS", 20,'bold'), bg="black", fg='green')
        label1.place(x=65,y=125)

    elif 75 >= act > 51:
        label1 = Label(master=win1, text="Fortnite", font=("Comic Sans MS", 20, 'bold'), bg="black", fg='purple')
        label1.place(x=95, y=125)

    elif 90 >= act > 76:
        label1 = Label(master=win1, text="Minecraft", font=("Comic Sans MS", 20, 'bold'), bg="black", fg='blue')
        label1.place(x=85, y=125)

    else:
        label1 = Label(master=win1, text="CS 2", font=("Comic Sans MS", 20, 'bold'), bg="black", fg='red')
        label1.place(x=115, y=125)

    win1.mainloop(2)

# функция чтобы закрывать это окно
def close_random_action():
    win1.destroy()

# как я понял чтобы сделать такое надо с начала создать счетчик открытых окон
def win_count():
    x = 0
    # я не знаю как тут написать но должно быть что-то на подобе 'если win1 открыто то x = x + 1' наверное с циклом while
        x = x + 1
        print(x)

    return x
# функции чтобы вызвать их несколько сразу
def multy_func():
    vk_music_open()
    click_audio()

    return vk_music_open() and click_audio()

def multy_func1():
    random_action()
    click_audio()
    win_count()

    return random_action(), click_audio() , win_count()

#кнопки
button = Button(text="PC OFF", height=2, width=6, command=off , font=("Comic Sans MS", 20,'bold'),activebackground="red",fg='grey', activeforeground='black')
button.place(x=308.5,y=375.5)
button.config(background="pink")

button1 = Button(text="", height=98, width=98, command=multy_func , image=imgVK, font=("Comic Sans MS", 20,'bold'))
button1.place(x=10,y=375.5)
button1.config(background="lightblue")

button2 = Button(text="random", height=2, width=6, command=multy_func1, font=("Comic Sans MS", 20,'bold'))
button2.place(x=150,y=375.5)
button2.config(background="lightgreen")

button2 = Button(text="close win", height=2, width=6, command=close_random_action, font=("Comic Sans MS", 20,'bold'))
button2.place(x=150,y=200)
button2.config(background="lightgreen")

win.mainloop()

Ответы (1 шт):

Автор решения: Fox Fox

Решение, которое применяю я, таково. Есть форма, в которой есть кнопка, которая формирует дочернюю форму с помощью процедуры, привязанной к этой кнопке. Я передаю кнопку как объект в процедуру, запоминаю связь кнопки с процедурой, отменяю привязку кнопки к процедуре, а в конце процедуры восстанавливаю привязку кнопки к процедуре. Выглядит это схематично так:

В главное форме:

my_button = tkinter.Button(master = main_form, command = lambda: my_procedure(my_button))

Процедура, связанная с кнопкой:

def my_procedure(widget_button):

 command_saved = widget_button.cget("command")
 widget_button.configure(command = "")
 ...........
 widget_button.configure(command = command_saved)

Это самый простой вариант, не привязанный к именам, классам и прочему, его легко таскать в другие аналогичные процедуры.

Кроме того, метод grab_set(), привязанный к дочерней форме, блокирует доступ к главной форме, соответственно и к кнопкам в ней.

→ Ссылка