Tkinter pack_forget() 和 destroy() 不起作用

Tkinter pack_forget() and destroy() don't work

我对这两个功能没有按预期工作有疑问。 我想使用选择表单下拉菜单,并根据选择在根 window 中显示两组不同的复选框。为此,我使用以下代码:

    from tkinter import *
import tkinter as tk

def evaluation(form):
    form.pack_forget()
    form.destroy()
    form=Frame(root)
    GotPlatform=platform.get()
    for elem in PlatformOption[GotPlatform]:
        OptionButtonSel[elem]=Checkbutton(form, text=elem)
        OptionButtonSel[elem].pack()
    form.pack(fill="both", expand = 1)  

PlatformOption={'Option1':["option1-1","option1-2"],'Option2':["option2-1","option2-2"]}
OptionButtonSel={}

root = tk.Tk()
f1=Frame(root)
menuBar = tk.Menu(root)
menu1 = tk.Menu(root)
submenu = tk.Menu(root)
platform = StringVar()
submenu.add_radiobutton(label="Option1", value="Option1", variable=platform,command=lambda:evaluation(f1))
submenu.add_radiobutton(label="Option2", value="Option2", variable=platform,command=lambda:evaluation(f1))
menuBar.add_cascade(label="Options", menu=menu1)
menu1.add_cascade(label="Select option", menu=submenu)

root.config(menu=menuBar)
root.mainloop()

代码有效,但每当我更改下拉菜单中的选项时,复选框选项都会堆叠起来,不会按预期被覆盖。

这让我感到困惑,因为我使用了其他代码并且它按预期工作:

from tkinter import Tk, Frame, Menu, Label



def show_frame1():
    forget_all()
    f1.pack(fill="both", expand = 1)  
    


def show_frame2():
    forget_all()
    f2.pack(fill="both", expand = 1)  
    


def forget_all():
    f1.pack_forget()
    f2.pack_forget()


root = Tk()
f1 = Frame(root)
f2 = Frame(root)
Label(f1, text="MENU SELECTED 1").pack()
Label(f2, text="MENU SELECTED 2").pack()
menubar=Menu(root)
subMenu=Menu(menubar, tearoff = 0)
menubar.add_cascade(label = 'MENU', menu=subMenu)
subMenu.add_command(label = 'SUBMENU1', command = show_frame1)
subMenu.add_command(label = 'SUBMENU2', command = show_frame2)
root.config(menu = menubar)


root.mainloop() 

除了 addind destroy(),frame 和 pack_forget() 的用法对我来说似乎是一样的。

我用的是Python3.10.1,IDESpyder最新版本,Windows8.

它给出了它不起作用的效果,因为小部件在屏幕上是不可见的。然而,这个主题在下面有进一步的解释

为了证明我的理论,我做了一些关于这个主题的其他研究,并且 https://www.geeksforgeeks.org/python-forget_pack-and-forget_grid-method-in-tkinter/ 完美解释 pack_forget() 的概念

问题的根源在于您创建了一个从未出现在屏幕上的表单。您创建它,但永远不要对其调用 pack。然后在每次单击按钮时将此表单传递给该函数。换句话说,您一直在传递原始表单,而不是重新创建的新表单。

最好的解决办法是你的主代码在窗体上调用packplacegrid,然后在函数中你可以删除窗体的子项不删除表格本身。

因此,在创建 f1 后不久添加以下内容:

f1.pack(fill="both", expand=True)

接下来,修改 evaluation 以销毁子项而不是表单本身:

def evaluation(form):
    for child in form.winfo_children():
        child.destroy()

    GotPlatform=platform.get()
    for elem in PlatformOption[GotPlatform]:
        OptionButtonSel[elem]=Checkbutton(form, text=elem)
        OptionButtonSel[elem].pack()