Python 3.x 删除以前在TKINTER菜单栏中选择选项的小部件

Python 3.x 删除以前在TKINTER菜单栏中选择选项的小部件,python-3.x,tkinter,Python 3.x,Tkinter,我有一个菜单栏,有两个选项 [1]添加数据 [2]更新数据 当我选择一个选项时,窗口小部件将加载到窗口中。之后,当我选择另一个选项时,前面的小部件保持不变&新的小部件重叠。我如何保持窗口并破坏其上现有的小部件。 由于其大小,我没有将原始代码附加到其他菜单选项,但是代码片段复制了实际场景 我已尝试再次调用该函数 如果我没弄错你想要什么。最好为addcustomer和updatecustomer创建两个框架。然后根据需要显示和隐藏它们。像这样,小部件只创建一次,并根据需要重用。我试着尽可能少地修改你

我有一个菜单栏,有两个选项

[1]添加数据

[2]更新数据

当我选择一个选项时,窗口小部件将加载到窗口中。之后,当我选择另一个选项时,前面的小部件保持不变&新的小部件重叠。我如何保持窗口并破坏其上现有的小部件。 由于其大小,我没有将原始代码附加到其他菜单选项,但是代码片段复制了实际场景

我已尝试再次调用该函数


如果我没弄错你想要什么。最好为addcustomer和updatecustomer创建两个框架。然后根据需要显示和隐藏它们。像这样,小部件只创建一次,并根据需要重用。我试着尽可能少地修改你的代码

我使用了grid和grid_remove来隐藏和显示。我找不到要删除的包。
编辑:下面更改为使用pack\u forget(),在这个简单的例子中,它似乎可以正常工作

import tkinter as tk

root = None
data = None
def _add(dt):
    global data
    data = dt
    print(data, 'ADDED')

def _edit(new_dt):
    global data
    data = new_dt
    print('UPDATED')
    print("DATA =", data)

def homepage():
    global root

    def cust_edit():
        # c_add.grid_remove()    Old grid version replaced by pack version
        # c_upd.grid()            
        c_add.pack_forget()       # Hide Add Customer
        c_upd.pack()              # Show Update Customer

    def cust_add():
        # c_upd.grid_remove()     # Grid version removed.
        # c_add.grid()            
        c_upd.pack_forget()       # Hide Update Customer
        c_add.pack()              # Show Add Customer    

    root = tk.Tk()
    root.geometry('300x400')
    root.title('CAR  FLEET  MANAGEMENT  SYSTEM')

    c_add = tk.Frame(root)
    tk.Label(c_add,text="ADD NAME:").pack()
    a_ent = tk.Entry(c_add)
    a_btn = tk.Button(c_add, text='ADD', command=lambda: _add(a_ent.get()))
    a_ent.pack()
    a_btn.pack()

    c_upd = tk.Frame(root)
    tk.Label(c_upd,text="UPDATE NAME:").pack()
    u_ent = tk.Entry(c_upd)
    u_btn = tk.Button(c_upd, text='UPDATE', command=lambda: _edit(u_ent.get()))
    u_ent.pack()
    u_btn.pack()

    menus = tk.Menu()
    cst = tk.Menu(menus, tearoff=tk.FALSE)
    cst.add_command(label="Add New Customer", command=cust_add)
    cst.add_command(label="Change Customer Details", command=cust_edit)
    menus.add_cascade(label='CUSTOMERS', menu=cst)
    root.config(menu=menus)
    root.mainloop()
homepage()

我用的是地方而不是网格。有没有带place..的remove()选项?我想您指的是pack,而不是place,因为您在原始问题中使用了pack。答案已更新为使用pack_forget()。只要这两个选项是唯一要打包到该容器中的东西,这将起作用。你忘记了它最初是在哪里包装的。grid_remove()确实记得最初网格化的位置。汉克斯,我原来的问题解决了。我还尝试在单独的文件中分离所有选项,以减少模块的加载时间。但是,这种方法似乎也是有效的。
import tkinter as tk

root = None
data = None
def _add(dt):
    global data
    data = dt
    print(data, 'ADDED')

def _edit(new_dt):
    global data
    data = new_dt
    print('UPDATED')
    print("DATA =", data)

def homepage():
    global root

    def cust_edit():
        # c_add.grid_remove()    Old grid version replaced by pack version
        # c_upd.grid()            
        c_add.pack_forget()       # Hide Add Customer
        c_upd.pack()              # Show Update Customer

    def cust_add():
        # c_upd.grid_remove()     # Grid version removed.
        # c_add.grid()            
        c_upd.pack_forget()       # Hide Update Customer
        c_add.pack()              # Show Add Customer    

    root = tk.Tk()
    root.geometry('300x400')
    root.title('CAR  FLEET  MANAGEMENT  SYSTEM')

    c_add = tk.Frame(root)
    tk.Label(c_add,text="ADD NAME:").pack()
    a_ent = tk.Entry(c_add)
    a_btn = tk.Button(c_add, text='ADD', command=lambda: _add(a_ent.get()))
    a_ent.pack()
    a_btn.pack()

    c_upd = tk.Frame(root)
    tk.Label(c_upd,text="UPDATE NAME:").pack()
    u_ent = tk.Entry(c_upd)
    u_btn = tk.Button(c_upd, text='UPDATE', command=lambda: _edit(u_ent.get()))
    u_ent.pack()
    u_btn.pack()

    menus = tk.Menu()
    cst = tk.Menu(menus, tearoff=tk.FALSE)
    cst.add_command(label="Add New Customer", command=cust_add)
    cst.add_command(label="Change Customer Details", command=cust_edit)
    menus.add_cascade(label='CUSTOMERS', menu=cst)
    root.config(menu=menus)
    root.mainloop()
homepage()