如何实现Tkinter Combobox自定义输入项添加至下拉列表?
实现可动态添加选项的Tkinter Combobox
问题描述
想要制作一个Tkinter Combobox,支持用户在输入框中输入文本,点击按钮后,输入的文本会自动添加到该Combobox的下拉列表中。以下是初步编写的代码:
import tkinter as tk from tkinter import ttk app_background = "#f0f0f0" button_background = "#e0e0e0" empty = [] root = tk.Tk() root.title("Forklift calling EOL interface") root.resizable(True, True) root.attributes('-fullscreen', False) # Create a frame frame = tk.Frame(root, background=app_background) frame.grid() root.anchor("center") main_title = tk.Label(frame, text = "Title",font=("Helvetica", 30)) subtitle = tk.Label(frame, text = "Subtitle",font=("Helvetica", 15) ) var = tk.IntVar() part_dropdown = ttk.Combobox(frame, textvariable=var, values=empty, font=("Helvetica", 20), width=24, background=button_background, state="readonly") send_item = tk.Button(frame, text ="->") add_item = tk.Button(frame, text ="+",command = new_item) #Putting the stuff in the grid main_title.grid(row=0, column=0,pady=10, padx= (0,0)) subtitle.grid(row=1, column = 0, pady = 6, padx=(0,0) ) send_item.grid(row=2, column = 0, pady = 6, padx= (25,0)) add_item.grid(row=3, padx= (30,0)) part_dropdown.grid(row=2, column = 0, pady = 6) root.mainloop()
实现方法
对原代码做以下修改即可实现需求:
调整Combobox核心配置
- 把
state="readonly"改为state="normal",允许用户输入文本 - 将文本变量从
tk.IntVar()换成tk.StringVar(),适配文本输入场景
- 把
编写添加选项的函数
- 在
new_item函数中获取输入文本,过滤空内容和重复项 - 将有效文本追加到下拉列表的选项集合中,再刷新Combobox
- 在
修复布局重叠问题
- 原代码中
send_item和part_dropdown共用同一网格位置,需调整列索引避免重叠
- 原代码中
修改后的完整代码:
import tkinter as tk from tkinter import ttk app_background = "#f0f0f0" button_background = "#e0e0e0" def new_item(): # 获取并清理输入文本 input_text = var.get().strip() if not input_text: return # 获取当前下拉列表的所有选项 current_values = list(part_dropdown['values']) # 避免添加重复项 if input_text not in current_values: current_values.append(input_text) part_dropdown['values'] = current_values var.set("") # 清空输入框 root = tk.Tk() root.title("Forklift calling EOL interface") root.resizable(True, True) root.attributes('-fullscreen', False) # 创建主框架 frame = tk.Frame(root, background=app_background) frame.grid() root.anchor("center") # 界面元素创建 main_title = tk.Label(frame, text="Title", font=("Helvetica", 30), background=app_background) subtitle = tk.Label(frame, text="Subtitle", font=("Helvetica", 15), background=app_background) var = tk.StringVar() # 配置可输入的Combobox part_dropdown = ttk.Combobox(frame, textvariable=var, values=[], font=("Helvetica", 20), width=24, state="normal") send_item = tk.Button(frame, text="->", background=button_background) add_item = tk.Button(frame, text="+", command=new_item, background=button_background) # 布局调整(解决重叠问题) main_title.grid(row=0, column=0, columnspan=2, pady=10, padx=(0, 0)) subtitle.grid(row=1, column=0, columnspan=2, pady=6, padx=(0, 0)) part_dropdown.grid(row=2, column=0, pady=6, padx=(0, 10)) send_item.grid(row=2, column=1, pady=6, padx=(10, 0)) add_item.grid(row=3, column=0, columnspan=2, pady=6, padx=(30, 0)) root.mainloop()
关键说明
new_item函数做了双重校验,确保只添加非空且未存在的选项- 调整网格布局后,控件不再重叠,交互逻辑更清晰
- ttk Combobox的背景色无法通过
background直接设置,如需自定义样式,可使用ttk.Style()配置
内容的提问来源于stack exchange,提问作者dqdq dqsss
相关产品推荐
相关产品推荐

