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