为什么我在 Tkinter 中得到一个额外的空 window?

Why do I get an extra empty window in Tkinter?

这是我的代码:

from tkinter import *

OPTIONS = ["Available","Busy","Invisible","Away"]

now = Toplevel()
variable = StringVar(now)
variable.set(OPTIONS[0]) # default value
details = {"U_status":""}
def verify():
    global u_status
    details["U_status"]=variable.get()
    print ("value is:" + variable.get())
    now.destroy()
def status():
    w = OptionMenu(now, variable, *OPTIONS)
    w.pack()
    button = Button(now, text="OK", command=verify, relief='flat')
    button.pack()
if __name__=='__main__':
    status()
    mainloop()

虽然 运行 上面的代码与 window(我想要的)一起出现了另一个空的 window。谁能找出这段代码中的错误?

这里的now = Toplevel()应该换成Tk(),比如:

now = Tk()

当您使用 Toplevel() 时,会在后台生成 Tk() window,如果它尚未生成(您的情况),这就是您得到空白的原因新 window。实际上那个空白 window 是你的主要 window.

Toplevel() 用于为父 Tk() windows 创建子 windows,即,如果你想在你的主 window(now),你会用到Toplevel()。因为你的代码中不止一个 Tk() 会导致后面出现一些错误。

空白 window 实际上是 tkinter 默认创建的应用程序的根目录 window。您可能想要明确,并创建一个 tk.Tk() 根,并保留对它的引用。

新的 windows 可以随意生成和销毁;只要您保持 root 处于活动状态,您的应用就会继续存在。

也许是这样的:

import tkinter as tk


def verify():
    now = tk.Toplevel(root)
    details["U_status"] = variable.get()
    txt = f'value is: {details["U_status"]}'
    tk.Label(now, text=txt).pack()
    now.after(3000, now.destroy)
    
def status():
    tk.OptionMenu(root, variable, *OPTIONS).pack()
    tk.Button(root, text="OK", command=verify, relief='flat').pack()
    
    
if __name__=='__main__':
    
    OPTIONS = ["Available", "Busy", "Invisible", "Away"]
    
    root = tk.Tk()
    variable = tk.StringVar(root)
    variable.set(OPTIONS[0])
    details = {"U_status": ""}
    status()
    root.mainloop()