如何为Tkinter Entry组件设置预定义下拉选择列表?
解决方案:把Tkinter的Bookmaker输入框换成预定义下拉菜单
核心思路
用Tkinter的ttk.Combobox组件替代原来的Entry,它支持设置固定选项列表,还能禁止手动输入,完美匹配需求。
具体步骤
- 导入ttk模块:Combobox属于ttk子模块,需要额外导入
- 定义可选列表:把允许选择的博彩商做成固定列表
- 替换Entry为Combobox:创建下拉菜单并配置选项,设置为只读模式避免用户输入自定义内容
- 调整布局与取值逻辑:把原来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
相关产品推荐
相关产品推荐

