Пропустить функцию, когда активен Toplevel - PullRequest
0 голосов
/ 21 февраля 2020

Я пытаюсь пропустить эту функцию, если в данный момент открыто окно Toplevel. Это сделано для того, чтобы пользователь не спамил кнопку и не создавал миллиардов дополнительных уведомлений windows. То или иное, если окно Toplevel может закрыться автоматически через указанное количество времени, также будет работать. Код ниже. Любая помощь очень ценится, так как я новичок в Python. Спасибо!

def pingClick():
    os.system(
        '-c -H ' + tkvar1.get() + ' -B ' + tkvar2.get() + ' -L ' + tkvar3.get() + ' -V ' + tkvar4.get() + ' -T log.log')
    top = Toplevel()
    top.title("Ping")
    msg = Message(top, text=" - Notice - ")
    msg.pack()
    button = ttk.Button(top, text="Dismiss", command=top.destroy)
    button.pack()

1 Ответ

0 голосов
/ 21 февраля 2020

Создать глобальную переменную top = None. Когда вы создаете Toplevel(), сначала проверьте, является ли top None. Когда это не None, тогда не создавайте окно. Когда вы нажимаете кнопку, чтобы уничтожить окно, вы должны запустить функцию, которая установит его обратно top = None. Вы должны сделать это также, когда вы закрываете окно с помощью кнопки [X]

И вы можете использовать top.after(3000, ping_destroy), чтобы закрыть окно через 3000 мс (3 с)

import tkinter as tk

# --- functions ---

def ping_destroy():
    global top

    if top is not None:
        top.destroy()
        top = None

def ping_click():
    global top

    if top is None:
        #os.system('-c -H ' + tkvar1.get() + ' -B ' + tkvar2.get() + ' -L ' + tkvar3.get() + ' -V ' + tkvar4.get() + ' -T log.log')
        top = tk.Toplevel()
        top.title("Ping")

        msg = tk.Message(top, text="Notice")
        msg.pack()

        button = tk.Button(top, text="Dismiss", command=ping_destroy)
        button.pack()

        top.wm_protocol('WM_DELETE_WINDOW', ping_destroy) # run `ping_destroy` when use button [X]

        top.after(3000, ping_destroy) # close after 3000ms (3s)

# --- main ---

top = None

root = tk.Tk()

button = tk.Button(root, text='Ping', command=ping_click)
button.pack()

root.mainloop()
...