【问题标题】:Why do I get an extra empty window in Tkinter?为什么我在 Tkinter 中得到一个额外的空窗口?
【发布时间】:2020-11-12 06:28:27
【问题描述】:

这是我的代码:

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

在运行上述代码时,与窗口(我想要的)一起出现另一个空窗口。谁能弄清楚这段代码有什么问题?

【问题讨论】:

    标签: python tkinter window toplevel


    【解决方案1】:

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

    now = Tk()
    

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

    Toplevel() 用于为父Tk() 窗口创建子窗口,即,如果您希望在主窗口中包含子窗口(@98​​7654328@),您将使用Toplevel()。因为你的代码中有多个Tk() 会在以后导致一些错误。

    【讨论】:

    • 但是,一旦我这样做了,我将在使用 .destroy() 删除窗口时遇到错误
    • @CodeCarbonate now.destroy() 将破坏主窗口,在您的情况下,只需按下按钮,它就会破坏窗口。
    • 假设我命名一个名为 now 的变量并将其设置为 Tk() 的值,如果我只想删除主窗口并保持程序的其他部分运行我使用 now.destroy() .但我得到一个错误。
    • 程序的其他部分是什么意思?销毁Tk() 将销毁整个应用程序。
    • 就像将 now 的值重置为 Tk() 并在 now 销毁后显示具有不同内容的同一个窗口。
    【解决方案2】:

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

    新窗口可以随意生成和销毁;只要您保持 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()
    

    【讨论】:

    • 但是,当我运行你提供的代码时,会出现一个错误,指出 NameError: name 'mainloop' is not defined
    • 是的,它必须是root.mainloop(),对不起,我的错 - 我更正了。
    猜你喜欢
    • 1970-01-01
    • 2013-07-24
    • 2022-10-05
    • 1970-01-01
    • 2019-08-19
    • 2019-07-18
    • 2020-05-17
    • 1970-01-01
    • 2020-09-18
    相关资源
    最近更新 更多