Tkinter下拉菜单实现:根据选中项动态调整按钮触发逻辑
调整方案
核心实现逻辑是通过选项-函数映射字典完成不同保养项目的逻辑调度,后续新增保养项目只需新增对应处理函数并更新映射规则即可,无需修改核心调度逻辑。
具体调整步骤
- 补充轮胎换位、火花塞检查的对应处理函数,可根据实际保养周期修改里程阈值
- 新增保养选项和处理函数的映射字典,完成选项值到执行函数的一一绑定
- 新增通用调度函数作为提交按钮的触发事件,自动读取当前选中的保养项目,调用对应处理逻辑
- 修正下拉菜单初始值,原初始值
Oil和选项列表的Oil change不匹配,会导致初始选中状态异常
修改后完整代码
from tkinter import * from tkinter import ttk # 初始化根窗口 root = Tk() root.title("汽车保养应用") root.resizable(False, False) tab_control = ttk.Notebook(root) tab1 = ttk.Frame(tab_control) tab2 = ttk.Frame(tab_control) tab_control.add(tab1, text="保养记录") tab_control.add(tab2, text="保养检查") tab_control.pack(expand=1, fill="both") # 全局配置参数 miles = IntVar() last_miles = IntVar() # 不同保养项目的周期阈值 OIL_CHANGE_CYCLE = 3000 TIRE_ROTATION_CYCLE = 5000 SPARK_PLUGS_CYCLE = 30000 # 保养项目处理函数 def check_oil_change(): try: current_miles = int(miles_entry.get()) last_change_miles = int(last_miles_entry.get()) except ValueError: output_label.config(text="请输入有效的里程数字") return miles_till = OIL_CHANGE_CYCLE - (current_miles - last_change_miles) if miles_till == 0: output_label.config(text="你当前需要更换机油") elif miles_till > 0: output_label.config(text="距离下次更换机油还有{}英里".format(miles_till)) else: output_label.config(text="你已超期{}英里未更换机油".format(abs(miles_till))) # 新增:轮胎换位检查函数 def check_tire_rotation(): try: current_miles = int(miles_entry.get()) last_rotation_miles = int(last_miles_entry.get()) except ValueError: output_label.config(text="请输入有效的里程数字") return miles_till = TIRE_ROTATION_CYCLE - (current_miles - last_rotation_miles) if miles_till == 0: output_label.config(text="你当前需要进行轮胎换位") elif miles_till > 0: output_label.config(text="距离下次轮胎换位还有{}英里".format(miles_till)) else: output_label.config(text="你已超期{}英里未进行轮胎换位".format(abs(miles_till))) # 新增:火花塞检查函数 def check_spark_plugs(): try: current_miles = int(miles_entry.get()) last_plugs_miles = int(last_miles_entry.get()) except ValueError: output_label.config(text="请输入有效的里程数字") return miles_till = SPARK_PLUGS_CYCLE - (current_miles - last_plugs_miles) if miles_till == 0: output_label.config(text="你当前需要更换火花塞") elif miles_till > 0: output_label.config(text="距离下次更换火花塞还有{}英里".format(miles_till)) else: output_label.config(text="你已超期{}英里未更换火花塞".format(abs(miles_till))) # 新增:通用调度函数 def handle_maintenance_check(): selected_item = clicked.get() # 选项和处理函数的映射字典 maintenance_func_map = { "Oil change": check_oil_change, "Tire Rotation": check_tire_rotation, "Spark Plugs": check_spark_plugs } # 调用对应处理函数 if selected_item in maintenance_func_map: maintenance_func_map[selected_item]() # tab1 控件 last_miles_label = ttk.Label(tab1, text= "上次保养时的里程数是多少?") last_miles_entry = ttk.Entry(tab1, width=7) # tab1 布局 last_miles_label.grid(row=0, column=0) last_miles_entry.grid(row=0, column=1) # tab2 控件 miles_label = ttk.Label(tab2, text= "输入车辆当前里程数:") miles_entry = ttk.Entry(tab2, width=7) # 修改:按钮绑定通用调度函数而非直接绑定换机油函数 miles_button = ttk.Button(tab2, text="提交", command=handle_maintenance_check) output_label = ttk.Label(tab2, text="") maintenance_choices = [ # 下拉菜单选项 "Oil change", "Tire Rotation", "Spark Plugs", ] clicked = StringVar() # 修改:修正初始值和选项匹配 clicked.set("Oil change") maintenance_choices_dropdown = OptionMenu(tab2, clicked, *maintenance_choices) # tab2 布局 maintenance_choices_dropdown.grid(row=0, column=0, sticky="W") miles_label.grid(row=1, column=0) miles_entry.grid(row=1, column=1) miles_button.grid(row=1, column=2) output_label.grid(row=2, column=1) root.mainloop()
内容的提问来源于stack exchange,提问作者owwix
相关产品推荐
相关产品推荐

