Tkinter动态生成Entry输入框后删除旧控件且不影响固定控件求助
解决方案
你直接调用根窗口的winfo_children()删除控件会命中所有根窗口下的控件,包括固定的数量输入框、按钮、标签,只需要把动态生成的输入框和固定控件做区分即可,推荐两种实现方式:
方案1:维护列表存储动态控件实例
这种方式后续可以直接通过列表读取所有动态输入框的内容,适合需要对输入框内容做批量处理的场景:
from tkinter import * root = Tk() # 存储动态生成的输入框实例 dynamic_entries = [] def boxes(): # 先销毁所有旧的动态输入框 for entry in dynamic_entries: entry.destroy() dynamic_entries.clear() amount = int(number_boxes.get()) for i in range(amount): for y in range(4): set_boxes = Entry(root, borderwidth=3) set_boxes.grid(row=i+4, column=y) dynamic_entries.append(set_boxes) # 固定控件部分 label_number_boxes = Label(root, text='输入要生成的输入框行数') label_number_boxes.grid(row=0, column=0) number_boxes = Entry(root, width=20, bg='white', fg='black', borderwidth=3) number_boxes.grid(row=1, column=0) button_number_boxes = Button(root, text='确认生成数量', command=boxes) button_number_boxes.grid(row=2, column=0) root.mainloop()
方案2:独立容器装载动态控件
把所有动态输入框放在单独的Frame容器中,删除时只需要遍历该容器的子控件即可,不需要额外维护全局列表,代码更简洁:
from tkinter import * root = Tk() # 专门装载动态输入框的容器 entry_frame = Frame(root) entry_frame.grid(row=3, column=0, columnspan=4) def boxes(): # 销毁容器内所有旧控件,不会影响外部固定控件 for widget in entry_frame.winfo_children(): widget.destroy() amount = int(number_boxes.get()) for i in range(amount): for y in range(4): # 输入框父控件设置为entry_frame set_boxes = Entry(entry_frame, borderwidth=3) set_boxes.grid(row=i, column=y) # 固定控件部分 label_number_boxes = Label(root, text='输入要生成的输入框行数') label_number_boxes.grid(row=0, column=0) number_boxes = Entry(root, width=20, bg='white', fg='black', borderwidth=3) number_boxes.grid(row=1, column=0) button_number_boxes = Button(root, text='确认生成数量', command=boxes) button_number_boxes.grid(row=2, column=0) root.mainloop()
内容的提问来源于stack exchange,提问作者Benny Rodríguez
相关产品推荐
相关产品推荐

