Python Tkinter多Combobox取值相加显示问题及完整实现代码
问题根因
- 作用域错误:
click函数是全局函数,无法直接访问main函数内定义的combo_impact、combo_likelihood、数值映射字典等局部变量,会触发变量未定义报错 - 取值逻辑错误:
combo.get()获取到的是下拉框选中的文本描述(比如Catstrophic、Almost Certain),不是对应的评分数值,直接调用int()转换会抛出类型异常 - 变量初始化错误:
totalvalues是main内的局部变量,全局global声明无效,首次触发点击如果条件不满足,直接拼接字符串会触发未定义报错
修复后完整代码(已汉化界面)
import tkinter as tk from tkinter import ttk def main(): # 影响程度对应分值映射 impactDict = {'灾难性': 5, '严重': 4, '较大': 3, '中等': 2, '轻微':1} # 发生概率对应分值映射 likelihoodDict = {'几乎确定': 5, '很可能': 4, '可能': 3, '不太可能': 2, '罕见':1} root = tk.Tk() root.title("风险评分工具") root.configure(bg='Dodgerblue4') # 影响程度选择区域 tk.Label(root, text='法律风险影响程度', bd=3, bg='Dodgerblue4', fg='white').grid(row=0, column=0) var_impact = tk.StringVar() combo_impact = ttk.Combobox(root, values=list(impactDict.keys()), justify="center", textvariable=var_impact) combo_impact.bind('<<ComboboxSelected>>', lambda event: impact_level.config(text=impactDict[var_impact.get()])) combo_impact.grid(row=0, column=1) combo_impact.current(0) impact_level = tk.Label(root, text="", bg='Dodgerblue4', fg='white') impact_level.grid(row=0, column=2, padx=10) # 发生概率选择区域 tk.Label(root, text='法律风险发生概率', bd=3, bg='Dodgerblue4', fg='white').grid(row=1, column=0) var_likelihood = tk.StringVar() combo_likelihood = ttk.Combobox(root, values=list(likelihoodDict.keys()), justify="center", textvariable=var_likelihood) combo_likelihood.bind('<<ComboboxSelected>>', lambda event: likelihood_level.config(text=likelihoodDict[var_likelihood.get()])) combo_likelihood.grid(row=1, column=1) combo_likelihood.current(0) likelihood_level = tk.Label(root, text="未选择", bg='Dodgerblue4', fg='white') likelihood_level.grid(row=1, column=2, padx=10) # 评分结果展示区域 total = tk.Label(root,text = "", bg='Dodgerblue4', fg='white' ) total.grid(row=2, column = 2, padx=20, pady=10) # 计算逻辑内置到main函数中,可直接复用局部作用域变量 def click(): if var_impact.get() and var_likelihood.get(): impact_val = impactDict[var_impact.get()] likelihood_val = likelihoodDict[var_likelihood.get()] totalvalues = impact_val + likelihood_val total.configure(text="风险评分:" + str(totalvalues)) else: total.configure(text="风险评分:请完成全部选择") tk.Button(root,text='计算评分', command=click).grid(column=3,row=3) root.mainloop() if __name__ == '__main__': main()
内容的提问来源于stack exchange,提问作者henoker
相关产品推荐
相关产品推荐

