使用tkinter开发几何计算器时出现Square_Area未定义的NameError报错求助
问题根因
Python是解释型语言,代码按从上到下的顺序逐行执行。你在创建绑定Square_Area函数的Button控件时,Square_Area的函数定义放在了代码更靠后的位置,执行到Button初始化这行时,Python还没有加载到这个函数的定义,因此会抛出名称未定义的错误,和函数名本身是否拼写一致无关。
修复方案
把Square_Area函数的定义移动到创建正方形计算界面的代码块之前即可,调整后的完整可运行代码如下:
from tkinter import * root = Tk() # setting up window root.geometry("600x400") root.minsize(600, 400) root.maxsize(600, 400) root.title("Shape Calculator") # declaring variable SquareSide = StringVar() SquareArea = StringVar() # 提前定义所有需要绑定到控件的函数 # area result functions def Square_Area(): side = float(SquareSide.get()) area = side*side SquareArea.set(f"{area}") # function to clear screen def kill_frame(): mt.pack_forget() saf.pack_forget() tsaf.pack_forget() # menu functions # area functions def square_area(): kill_frame() tsaf.pack(fill="both") saf.pack(side=LEFT, anchor="nw") # main page text mt = Frame(root) mt.pack() title = Label(mt, fg="red", text="Select any field that you want to calculate", font=("arial", 18, "bold")) title.pack(padx=62, pady=185, side=LEFT) # layout for area of square tsaf = Frame(root) saf = Frame(root) Label(tsaf, bg="gray", fg="blue", text="Square Area Calculator", font=("calibri", 18, "italic")).pack(fill="x", ipady=10) Label(saf, fg="red", text="Side of Square:", font=("calibri", 18, "italic")).grid(row=0, column=0, pady=30, padx=30) Label(saf, fg="red", text="Area of Square:", font=("calibri", 18, "italic")).grid(row=1, column=0, pady=30, padx=30) Entry(saf, fg="blue", borderwidth=6, textvariable=SquareSide, font=("comicsansms", 16, "bold")).grid(row=0, column=1, pady=30, padx=20, ipadx=50) Entry(saf, fg="blue", borderwidth=6, textvariable=SquareArea, font=("comicsansms", 16, "bold")).grid(row=1, column=1, pady=30, padx=20, ipadx=50) Button(saf, fg="blue", text="Get Area", activeforeground="red", borderwidth=4, command = Square_Area, font=("comicsansms", 16, "italic")).grid(row=2, column=1, pady=30, padx=50, ipadx=50) # making the menu main_menu = Menu(root) # 2d shape area m1 = Menu(main_menu, tearoff=0) m1.add_command(label="Square", command = square_area) main_menu.add_cascade(label="Area calculator", menu=m1) root.config(menu=main_menu) root.mainloop()
额外优化建议
- 后续开发建议把所有自定义函数的定义都放在业务控件初始化代码的前面,避免同类问题重复出现
- 可以给输入框增加异常捕获逻辑,避免用户输入非数字内容时程序崩溃
内容的提问来源于stack exchange,提问作者Sarthak Hingankar
相关产品推荐
相关产品推荐

