Python Tkinter单按钮多公式计算GUI报错问题求助
问题描述
本人拥有Arduino与Matlab编程基础,刚接触Python,计划开发一个点击单个计算按钮即可完成多公式运算的简易GUI。最初的单计算版本代码运行正常,但扩展为多输入多公式版本后,出现计算按钮消失、报NameError(提示calculate_button和calculate_z未定义)的问题;若为每个计算单独设置按钮及对应函数则可正常运行。现附上扩展后的代码,请求协助排查以实现单按钮完成所有计算的需求。
核心错误分析
- 缩进逻辑混乱:
calculate_values函数中,try块仅包裹了变量输入部分,后续的计算逻辑、结果更新代码缩进错误,导致Python解释器无法正确识别函数范围,进而引发变量未定义报错。 - 未定义变量引用:计算
Tx和Ty时使用了未定义的变量T,实际应使用之前计算得到的链条张力CT。 - UI布局不合理:计算按钮的
grid参数设置为row=10, column=1, columnspan=2,但右侧结果标签仅到row=8,按钮位置过于靠下会被窗口隐藏,需调整到合理位置。 - 标签文字错误:
Ix_label的文本被错误设置为"Phi [deg]",应对应输入项Ix(初级减速比),需修正为"Primary Reduction [-]"。
修正后的完整代码
import tkinter as tk import math # 执行所有计算的函数 def calculate_values(): try: Te = float(Te_entry.get()) # 发动机扭矩 [Nm] Ix = float(Ix_entry.get()) # 初级减速比 [-] I1 = float(I1_entry.get()) # 一档传动比 [-] Phi = float(Phi_entry.get()) # 链轮压力角 [Deg] Nr = float(Nr_entry.get()) # 后链轮齿数 [-] Nf = float(Nf_entry.get()) # 前链轮齿数 [-] # 计算链节角 (CP) 单位:度 CP = 180 / Nr # 计算节圆直径 (PD) 单位:米 PD = CP / math.sin(CP*(math.pi/180)) # 计算节圆半径 (PR) 单位:米 PR = PD / 2 # 计算前链轮扭矩 (Mf) 单位:Nm Mf = Te * Ix * I1 # 计算链条张力 (CT) 单位:N CT = Mf / PR # 计算X方向张力 (Tx) 单位:N Tx = CT * math.cos(Phi*(math.pi/180)) # 计算Y方向张力 (Ty) 单位:N Ty = CT * math.sin(Phi*(math.pi/180)) # 计算最终传动比 If = Nr / Nf # 计算后链轮扭矩 (Mr) 单位:Nm Mr = Mf * If # 更新输出结果 CP_result_var.set(f"Chain Pitch [Deg] = {CP:.2f}") PD_result_var.set(f"Pitch Diameter [m] = {PD:.2f}") PR_result_var.set(f"Pitch Radius [m] = {PR:.2f}") Mf_result_var.set(f"Front Sprocket Torque [Nm] = {Mf:.2f}") CT_result_var.set(f"Chain Tension [N] = {CT:.2f}") Tx_result_var.set(f"Chain Tension X-direction [N] = {Tx:.2f}") Ty_result_var.set(f"Chain Tension Y-direction [N] = {Ty:.2f}") If_result_var.set(f"Final Drive Ratio [-] = {If:.2f}") Mr_result_var.set(f"Rear Sprocket Torque [Nm] = {Mr:.2f}") except ValueError: CP_result_var.set("Chain Pitch [Deg] = Invalid Input") PD_result_var.set("Pitch Diameter [m] = Invalid Input") PR_result_var.set("Pitch Radius [m] = Invalid Input") Mf_result_var.set("Front Sprocket Torque [Nm] = Invalid Input") CT_result_var.set("Chain Tension [N] = Invalid Input") Tx_result_var.set("Chain Tension X-direction [N] = Invalid Input") Ty_result_var.set("Chain Tension Y-direction [N] = Invalid Input") If_result_var.set("Final Drive Ratio [-] = Invalid Input") Mr_result_var.set("Rear Sprocket Torque [Nm] = Invalid Input") # 创建主窗口 app = tk.Tk() app.title("Multi-Calculation GUI") # 创建并放置输入字段和标签 Te_label = tk.Label(app, text="Engine Torque [Nm]:") Te_label.grid(row=0, column=0, padx=10, pady=5, sticky="w") Te_entry = tk.Entry(app) Te_entry.grid(row=0, column=1, padx=10, pady=5) Ix_label = tk.Label(app, text="Primary Reduction [-]:") Ix_label.grid(row=1, column=0, padx=10, pady=5, sticky="w") Ix_entry = tk.Entry(app) Ix_entry.grid(row=1, column=1, padx=10, pady=5) I1_label = tk.Label(app, text="First Gear Ratio [-]:") I1_label.grid(row=2, column=0, padx=10, pady=5, sticky="w") I1_entry = tk.Entry(app) I1_entry.grid(row=2, column=1, padx=10, pady=5) Phi_label = tk.Label(app, text="Sprocket Pressure Angle [Deg]:") Phi_label.grid(row=3, column=0, padx=10, pady=5, sticky="w") Phi_entry = tk.Entry(app) Phi_entry.grid(row=3, column=1, padx=10, pady=5) Nr_label = tk.Label(app, text="Rear Sprocket Teeth [-]:") Nr_label.grid(row=4, column=0, padx=10, pady=5, sticky="w") Nr_entry = tk.Entry(app) Nr_entry.grid(row=4, column=1, padx=10, pady=5) Nf_label = tk.Label(app, text="Front Sprocket Teeth [-]:") Nf_label.grid(row=5, column=0, padx=10, pady=5, sticky="w") Nf_entry = tk.Entry(app) Nf_entry.grid(row=5, column=1, padx=10, pady=5) # 创建并放置计算按钮 calculate_button = tk.Button(app, text="Calculate All", command=calculate_values) calculate_button.grid(row=6, column=0, columnspan=2, padx=10, pady=15) # 创建并放置结果标签 CP_result_var = tk.StringVar() CP_result_var.set("Chain Pitch [Deg] = ") CP_result_label = tk.Label(app, textvariable=CP_result_var) CP_result_label.grid(row=0, column=2, columnspan=2, padx=10, pady=5) PD_result_var = tk.StringVar() PD_result_var.set("Pitch Diameter [m] = ") PD_result_label = tk.Label(app, textvariable=PD_result_var) PD_result_label.grid(row=1, column=2, columnspan=2, padx=10, pady=5) PR_result_var = tk.StringVar() PR_result_var.set("Pitch Radius [m] = ") PR_result_label = tk.Label(app, textvariable=PR_result_var) PR_result_label.grid(row=2, column=2, columnspan=2, padx=10, pady=5) Mf_result_var = tk.StringVar() Mf_result_var.set("Front Sprocket Torque [Nm] = ") Mf_result_label = tk.Label(app, textvariable=Mf_result_var) Mf_result_label.grid(row=3, column=2, columnspan=2, padx=10, pady=5) CT_result_var = tk.StringVar() CT_result_var.set("Chain Tension [N] = ") CT_result_label = tk.Label(app, textvariable=CT_result_var) CT_result_label.grid(row=4, column=2, columnspan=2, padx=10, pady=5) Tx_result_var = tk.StringVar() Tx_result_var.set("Chain Tension X-direction [N] = ") Tx_result_label = tk.Label(app, textvariable=Tx_result_var) Tx_result_label.grid(row=5, column=2, columnspan=2, padx=10, pady=5) Ty_result_var = tk.StringVar() Ty_result_var.set("Chain Tension Y-direction [N] = ") Ty_result_label = tk.Label(app, textvariable=Ty_result_var) Ty_result_label.grid(row=6, column=2, columnspan=2, padx=10, pady=5) If_result_var = tk.StringVar() If_result_var.set("Final Drive Ratio [-] = ") If_result_label = tk.Label(app, textvariable=If_result_var) If_result_label.grid(row=7, column=2, columnspan=2, padx=10, pady=5) Mr_result_var = tk.StringVar() Mr_result_var.set("Rear Sprocket Torque [Nm] = ") Mr_result_label = tk.Label(app, textvariable=Mr_result_var) Mr_result_label.grid(row=8, column=2, columnspan=2, padx=10, pady=5) # 启动GUI主循环 app.mainloop()
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

