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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 12:27:01