Как сделать так, чтобы окно в 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 шт):
Решение, которое применяю я, таково. Есть форма, в которой есть кнопка, которая формирует дочернюю форму с помощью процедуры, привязанной к этой кнопке. Я передаю кнопку как объект в процедуру, запоминаю связь кнопки с процедурой, отменяю привязку кнопки к процедуре, а в конце процедуры восстанавливаю привязку кнопки к процедуре. Выглядит это схематично так:
В главное форме:
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(), привязанный к дочерней форме, блокирует доступ к главной форме, соответственно и к кнопкам в ней.