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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 03:22:00