You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现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()

实现方法

对原代码做以下修改即可实现需求:

  1. 调整Combobox核心配置

    • 把state="readonly"改为state="normal",允许用户输入文本
    • 将文本变量从tk.IntVar()换成tk.StringVar(),适配文本输入场景
  2. 编写添加选项的函数

    • 在new_item函数中获取输入文本,过滤空内容和重复项
    • 将有效文本追加到下拉列表的选项集合中,再刷新Combobox
  3. 修复布局重叠问题

    • 原代码中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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 14:25:11