代码之家  ›  专栏  ›  技术社区  ›  Crystalline Core

为什么我在特金特多了一个空窗户?

  •  0
  • Crystalline Core  · 技术社区  · 4 年前

    这是我的密码:

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

    在运行上述代码时,随着窗口(我想要的)出现另一个空窗口。有人能找出这段代码中的错误吗?

    1 回复  |  直到 4 年前
        1
  •  2
  •   Delrius Euphoria TheLizzard    4 年前

    在这里 now = Toplevel() Tk() ,例如:

    now = Tk()
    

    当你使用 Toplevel() Tk() 窗口是在后台生成的,如果它还没有生成(您的案例),这就是您获得一个空白新窗口的原因。实际上,那个空白窗口是你的主窗口。

    顶层() 用于为父窗口创建子窗口 Tk() 如果你想在主窗口中设置子窗口( now ),您将使用 顶层() Tk() 在你的代码中会导致一些错误。

        2
  •  0
  •   Reblochon Masque    4 年前

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

    新窗口可以在空闲时生成和销毁;只要你保持根活动,你的应用程序将继续存在。

    可能是这样的:

    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()
    
    推荐文章