Python Tkinter销毁顶级窗口并在其中创建一个新窗口';这是一个有按钮的地方

Python Tkinter销毁顶级窗口并在其中创建一个新窗口';这是一个有按钮的地方,python,tkinter,tk,Python,Tkinter,Tk,目前我正试图破坏顶级窗口(如果它在那里,如果不创建它),并在它的位置生成一个新窗口 目前,创建窗口的按钮会生成一个带有标签的小窗口,该窗口仅显示基于GUI上用户输入的命令行 然而,我尝试过谷歌搜索和很多不同的方法,但我无法让它破坏窗口并创建一个新窗口 def view_command(): # Views Command cmd_line_window = Toplevel() cmd_line_window.title('Command Line') cmd_line

目前我正试图破坏顶级窗口(如果它在那里,如果不创建它),并在它的位置生成一个新窗口

目前,创建窗口的按钮会生成一个带有标签的小窗口,该窗口仅显示基于GUI上用户输入的命令行

然而,我尝试过谷歌搜索和很多不同的方法,但我无法让它破坏窗口并创建一个新窗口

def view_command():  # Views Command
    cmd_line_window = Toplevel()
    cmd_line_window.title('Command Line')
    cmd_line_window.configure(background="#434547")

    #doing stuff here#

    cmd_label = Label(cmd_line_window, text=example_cmd_output, foreground="white", 
                      background="#434547")
    cmd_label.config(font=("Helvetica", 16))
    cmd_label.pack()

btn = Button(root, text="Click Me", command=view_command)
我尝试了一些
if
语句,一些
try
语句,但我似乎无法让它正常工作。我觉得有一个简单的方法可以在1函数中实现这一点,但是我似乎无法得到它

编辑:当前,每次我单击按钮,它都会更新我选择的所有变量并显示正确的内容,它只会不断生成更多带有更新标签的窗口

编辑:

我利用评论中的建议和底部的答案来充分利用这两个世界

这是我的代码,它打开一个窗口或更新标签的基础上,而不是窗口已经打开!谢谢大家

        def view_command():
        global cmd_label
        example_cmd_output = acodec_stream_choices[acodec_stream.get()] \
                         + encoder_dropdownmenu_choices[encoder.get()] + \
                         acodec_bitrate_choices[acodec_bitrate.get()] + \
                         acodec_channel_choices[acodec_channel.get()] + \
                         acodec_samplerate_choices[acodec_samplerate.get()] + \
                         acodec_gain_choices[acodec_gain.get()] + ac3_custom_cmd_input + ac3_title_input
        try:
            cmd_label.config(text=example_cmd_output)
        except (AttributeError, NameError):
            cmd_line_window = Toplevel()
            cmd_line_window.title('Command Line')
            cmd_line_window.configure(background="#434547")
            cmd_label = Label(cmd_line_window, text=example_cmd_output, foreground="white", background="#434547")
            cmd_label.config(font=("Helvetica", 16))
            cmd_label.pack()

btn = Button(root, text="Click Me", command=view_command)

正如我在一篇评论中提到的,您只需调用universal widget方法就可以摆脱任何当前可能已经存在的
Toplevel
。但是,由于您没有发布自己的代码尝试这样做(但不起作用),下面是一个可运行的示例:

import tkinter as tk


def view_command():  # Views Command
    global cmd_line_window

    try:
        cmd_line_window.destroy()
    except (AttributeError, NameError):
        pass

    cmd_line_window = tk.Toplevel()
    cmd_line_window.title('Command Line')
    cmd_line_window.configure(background="#434547")

    #doing stuff here#

    cmd_label = tk.Label(cmd_line_window, text=example_cmd_output, foreground="white",
                         background="#434547")
    cmd_label.config(font=("Helvetica", 16))
    cmd_label.pack()


example_cmd_output = 'example cmd output'
root = tk.Tk()
btn = tk.Button(root, text="Click Me", command=view_command)
btn.pack()
root.mainloop()
更新: 正如我和@acw1668在其他评论中提到的,更好的方法可能是只创建一次
Toplevel
窗口和
Label
,然后只更新
标签的文本(而不是在单击
按钮时销毁和重新创建所有内容。同样,您可以使用
try
/
catch
轻松实现这一点(代码略短):


正如我在一篇评论中提到的,您可以调用universal widget方法来消除任何可能已经存在的当前
Toplevel
。但是,由于您没有发布自己的代码尝试这样做(但不起作用),下面是一个可运行的示例:

import tkinter as tk


def view_command():  # Views Command
    global cmd_line_window

    try:
        cmd_line_window.destroy()
    except (AttributeError, NameError):
        pass

    cmd_line_window = tk.Toplevel()
    cmd_line_window.title('Command Line')
    cmd_line_window.configure(background="#434547")

    #doing stuff here#

    cmd_label = tk.Label(cmd_line_window, text=example_cmd_output, foreground="white",
                         background="#434547")
    cmd_label.config(font=("Helvetica", 16))
    cmd_label.pack()


example_cmd_output = 'example cmd output'
root = tk.Tk()
btn = tk.Button(root, text="Click Me", command=view_command)
btn.pack()
root.mainloop()
更新: 正如我和@acw1668在其他评论中提到的,更好的方法可能是只创建一次
Toplevel
窗口和
Label
,然后只更新
标签的文本(而不是在单击
按钮时销毁和重新创建所有内容。同样,您可以使用
try
/
catch
轻松实现这一点(代码略短):


在当前的
Toplevel
实例上调用该方法。我一直试图在Toplevel实例上调用.destroy(),但在它创建新实例之前,它只会循环,根本不会创建新窗口。你想破坏
Toplevel()
然后创建一个新的?或者当按下按钮时,你想检查是否存在任何顶级,然后删除所有现有的顶级?你能再解释一下吗?你能更新标签文本而不是销毁和创建窗口吗?@CoolCloud是的,我有一个窗口,它有几个下拉菜单等,一旦用户完成操作选举有一个按钮,允许他们查看他们选择的命令行。当他们按下此按钮时,一个窗口会打开一个基于他们选择的标签。如果他们更改设置并再次按下此按钮,我希望它删除存在的窗口并打开一个新窗口。acw1668我想只要它打开tiny window首先显示标签并在每次按下时更新标签。它需要检查窗口是否存在,如果没有打开它。在当前
顶级
实例上调用该方法。我一直在尝试调用.destroy()在Toplevel实例上,在创建一个新实例之前,它只会循环,根本不会创建新窗口
然后创建一个新的?或者当按下按钮时,你想检查是否存在任何顶级,然后删除所有现有的顶级?你能再解释一下吗?你能更新标签文本而不是销毁和创建窗口吗?@CoolCloud是的,我有一个窗口,它有几个下拉菜单等,一旦用户完成操作选举有一个按钮,允许他们查看他们选择的命令行。当他们按下此按钮时,一个窗口会打开一个基于他们选择的标签。如果他们更改设置并再次按下此按钮,我希望它删除存在的窗口并打开一个新窗口。acw1668我想只要它打开tiny window首先显示标签并在每次按下时更新标签。它需要检查窗口是否在那里,如果没有打开它。我是个白痴,我把这部分代码“try:cmd\u line\u window.destroy()除了(AttributeError,NameError):pass”在错误的位置导致了错误。我感谢详细的响应和解决方案。我仍然无法更新投票,但我确实将其标记为已接受的解决方案!我最终以这种方式使用了它。工作非常完美!感谢所有人的帮助!我是个白痴,我将这部分代码“try:cmd\u line\u window.destroy(),除了(AttributeError,NameError):pass“在导致错误的错误位置。我感谢详细的响应和解决方案。我仍然无法投票,但我确实将其标记为已接受的解决方案!我最终确实以这种方式使用了它。工作非常完美!感谢大家的帮助!