Toplevel 激活时跳过函数

Skip function when Toplevel is active

如果 Toplevel window 当前打开,我将尝试跳过此功能。这是为了避免用户向按钮发送垃圾邮件并创建十亿个额外通知 windows。那或者如果 Toplevel window 可以在指定的时间后自动关闭也可以。代码如下。非常感谢任何帮助,因为我是 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()

创建全局变量top = None。当您创建 Toplevel() 时,首先检查 top 是否为 None。如果不是 None,则不要创建 window。当您单击按钮销毁 window 时,您必须使用 运行 函数将其设置回 top = None。当您使用按钮 [X]

关闭 window 时,您也必须这样做

并且您可以使用top.after(3000, ping_destroy)在3000毫秒(3秒)后关闭window

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