Tkinter实现Combobox输入超8字符时自动新增组件的方案咨询
实现输入超8字符自动新增Combobox的解决方案
问题需求
已通过按钮实现手动新增Combobox的功能,需要补充:当用户在任意一个Combobox中输入的内容超过8个字符时,自动调用新增函数创建新的Combobox。
解决方案思路
- 为每个新创建的条形码Combobox绑定
<KeyRelease>事件,监听输入内容的变化 - 编写事件处理函数,判断当前输入的字符长度是否超过8
- 若超过限制且当前是最后一个Combobox(避免重复连续新增),则调用
new_item()创建新条目
修改后的完整代码
import tkinter as tk from tkinter import ttk root = tk.Tk() root.resizable(True, True) frame = tk.Frame(root) frame.grid(sticky='nsew') root.anchor("center") # 存储各类组件的列表 dropdown_barcode = [] quant_dropdown = [] delete_btn = [] canvas = tk.Canvas(frame) canvas.grid(row=2, column=0, pady=(5, 0), sticky='nsew') scrollbar = tk.Scrollbar(frame, orient="vertical", command=canvas.yview) scrollbar.grid(row=2, column=1, pady=(5, 0), sticky='ns') canvas.configure(yscrollcommand=scrollbar.set) canvas.bind('<Configure>', lambda e: canvas.configure(scrollregion=canvas.bbox("all"))) text_frame = tk.Frame(canvas) canvas.create_window((0, 0), window=text_frame, anchor="nw") def update_widgets(): for id3, btn_widget in enumerate(delete_btn): btn_widget.grid(row=id3, column=0, pady=6, padx= (20,5)) for idx, txt_widget in enumerate(dropdown_barcode): txt_widget.grid(row=idx, column=1, pady=6, padx=(5,5)) for id2, quant_widget in enumerate(quant_dropdown): quant_widget.grid(row=id2, column=2, pady=6, padx=(5,0)) canvas.configure(scrollregion=canvas.bbox("all")) def check_length(event): # 获取当前触发事件的Combobox current_box = event.widget # 获取输入内容长度 content_length = len(current_box.get()) # 判断是否超过8字符,且当前是最后一个Combobox(防止连续重复新增) if content_length > 8 and current_box == dropdown_barcode[-1]: new_item() def new_item(): new_bardcode = ttk.Combobox(text_frame, height=1, width=30, font=("Helvetica", 10)) # 绑定输入长度检查事件 new_bardcode.bind('<KeyRelease>', check_length) dropdown_barcode.append(new_bardcode) new_quant = ttk.Combobox(text_frame, height=1, width=5, font=("Helvetica", 10)) quant_dropdown.append(new_quant) # 获取当前行索引 current_index = len(dropdown_barcode) - 1 delete_btn1 = tk.Button(text_frame, text="-", width= 3, command=lambda idx=current_index: remove_item(idx)) delete_btn.append(delete_btn1) update_widgets() def remove_item(index): # 销毁对应索引的组件 dropdown_barcode[index].destroy() quant_dropdown[index].destroy() delete_btn[index].destroy() # 从列表中移除 del dropdown_barcode[index] del quant_dropdown[index] del delete_btn[index] update_widgets() send_item = tk.Button(frame, text="->") add_txtbox = tk.Button(frame, text="+", command=new_item) remove_text_btn = tk.Button(frame, text="-", command=lambda: remove_item(len(dropdown_barcode)-1) if dropdown_barcode else None) employee_id= ttk.Combobox(frame, height=1, width=30, font=("Helvetica", 10)) add_txtbox.grid(row=3, column=0, padx=(0, 250), pady=10) send_item.grid(row=3, column=0, pady=6, padx=(280, 0)) employee_id.grid(row=3, column=0, padx=(15,0)) new_item() # 添加初始组件 root.mainloop()
关键修改点
- 新增
check_length函数:监听输入事件,判断字符长度是否超过限制,满足条件时自动调用新增函数 - 在
new_item中为每个条形码Combobox绑定<KeyRelease>事件,关联到check_length函数 - 优化了底部删除按钮的逻辑,避免空列表时触发报错
内容的提问来源于stack exchange,提问作者dqdq dqsss
相关产品推荐
相关产品推荐

