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

如何为Tkinter Entry组件设置预定义下拉选择列表?

解决方案:把Tkinter的Bookmaker输入框换成预定义下拉菜单

核心思路

用Tkinter的ttk.Combobox组件替代原来的Entry,它支持设置固定选项列表,还能禁止手动输入,完美匹配需求。

具体步骤

  1. 导入ttk模块:Combobox属于ttk子模块,需要额外导入
  2. 定义可选列表:把允许选择的博彩商做成固定列表
  3. 替换Entry为Combobox:创建下拉菜单并配置选项,设置为只读模式避免用户输入自定义内容
  4. 调整布局与取值逻辑:把原来Entry的布局代码换成Combobox,保存数据时用combobox.get()获取选中值

修改后的完整代码

import tkinter as tk
from tkinter import ttk, messagebox
import pandas as pd
from datetime import datetime

def save_to_excel():
    # 获取各输入框/下拉菜单的值
    event = event_entry.get().strip()
    selection = selection_entry.get().strip()
    # 获取下拉菜单选中值
    bookmaker = bookmaker_combobox.get()
    odds = odds_entry.get().strip()
    
    # 验证输入(可根据需求调整)
    if not all([event, selection, bookmaker, odds]):
        messagebox.showerror("错误", "请填写所有必填项")
        return
    
    # 准备要追加的数据
    data = {
        "Event": [event],
        "Selection": [selection],
        "Bookmaker": [bookmaker],
        "Odds": [odds],
        "Timestamp": [datetime.now().strftime("%Y-%m-%d %H:%M:%S")]
    }
    df_new = pd.DataFrame(data)
    
    # 追加到Excel文件
    try:
        # 如果文件存在就追加,不存在就新建
        with pd.ExcelWriter("bet_data.xlsx", mode="a", if_sheet_exists="overlay", engine="openpyxl") as writer:
            df_new.to_excel(writer, index=False, header=not writer.sheets)
        messagebox.showinfo("成功", "数据已保存")
        # 清空输入框
        event_entry.delete(0, tk.END)
        selection_entry.delete(0, tk.END)
        # 下拉菜单重置为第一个选项
        bookmaker_combobox.current(0)
        odds_entry.delete(0, tk.END)
    except Exception as e:
        messagebox.showerror("错误", f"保存失败:{str(e)}")

# 创建主窗口
root = tk.Tk()
root.title("Bet Data Entry")
root.geometry("400x300")

# 预定义博彩商列表
BOOKMAKERS = ['Betfair', 'Skybet']

# 组件布局
# Event标签与输入框
tk.Label(root, text="Event:").grid(row=0, column=0, padx=10, pady=10, sticky="w")
event_entry = tk.Entry(root, width=30)
event_entry.grid(row=0, column=1, padx=10, pady=10)

# Selection标签与输入框
tk.Label(root, text="Selection:").grid(row=1, column=0, padx=10, pady=10, sticky="w")
selection_entry = tk.Entry(root, width=30)
selection_entry.grid(row=1, column=1, padx=10, pady=10)

# Bookmaker标签与下拉菜单
tk.Label(root, text="Bookmaker:").grid(row=2, column=0, padx=10, pady=10, sticky="w")
bookmaker_combobox = ttk.Combobox(root, values=BOOKMAKERS, state="readonly", width=28)
# 设置默认选中第一个选项
bookmaker_combobox.current(0)
bookmaker_combobox.grid(row=2, column=1, padx=10, pady=10)

# Odds标签与输入框
tk.Label(root, text="Odds:").grid(row=3, column=0, padx=10, pady=10, sticky="w")
odds_entry = tk.Entry(root, width=30)
odds_entry.grid(row=3, column=1, padx=10, pady=10)

# 保存按钮
save_btn = ttk.Button(root, text="Save Data", command=save_to_excel)
save_btn.grid(row=4, column=0, columnspan=2, pady=20)

# 启动主循环
root.mainloop()

关键说明

  • state="readonly":确保用户只能从列表里选,不能手动输入自定义内容
  • bookmaker_combobox.current(0):设置默认选中第一个选项,提升用户体验
  • 保存数据时用bookmaker_combobox.get()获取选中值,和原来Entry的取值逻辑兼容

内容的提问来源于stack exchange,提问作者Paul Corcoran

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 03:15:41