首页 > 解决方案 > 使用 tkinter 时出现名称错误

问题描述

我正在制作一个可以计算各种形状的面积、tsa、lsa、体积等的应用程序,但我收到了这个错误:

NameError:未定义名称“Square_Area”

但是该函数的名称与该行中的函数完全相同我很困惑这是出现错误的代码位

    # 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)

这是按钮正在使用的功能

    def Square_Area():
        side = float(SquareSide.get())
        area = side*side
        SquareArea.set(f"{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()
    
    # 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)
    
    
    # menu functions
    # area functions
    def square_area():
        kill_frame()
        tsaf.pack(fill="both")
        saf.pack(side=LEFT, anchor="nw")
    
    # function to clear screen
    def kill_frame():
        mt.pack_forget()
        saf.pack_forget()
        tsaf.pack_forget()
    
    # getting results
    # area result functions
    def Square_Area():
        side = float(SquareSide.get())
        area = side*side
        SquareArea.set(f"{area}")
    
    # 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()

我已经删除了关于其他形状的所有内容,如果有点凌乱,我只是留下了方形部分

标签: pythontkinter

解决方案


您需要在引用它之前定义该函数。由于您没有使用类,因此您正在执行 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()
def square_area():
    kill_frame()
    tsaf.pack(fill="both")
    saf.pack(side=LEFT, anchor="nw")

def Square_Area():
    side = float(SquareSide.get())
    area = side*side
    SquareArea.set(f"{area}")
# 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)


# menu functions
# area functions

# function to clear screen
def kill_frame():
    mt.pack_forget()
    saf.pack_forget()
    tsaf.pack_forget()

# getting results
# area result functions


# 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()

推荐阅读