【问题标题】:NameError: name 'f_num' is not defined in tkinter [closed]NameError:名称'f_num'未在tkinter中定义[关闭]
【发布时间】:2021-09-17 01:29:53
【问题描述】:

我正在尝试对我的计算器项目进行编程以执行操作。它可以执行加法,我想要它 执行剩下的四个(减号、乘法、除法、幂) 但是因为这个错误我被卡住了:

C:\Users\Admin\PycharmProjects\venv\Scripts\python.exe 
   "C:/Users/Admin/PycharmProjects/pythonProject/Calculator GUI v1.0.py"
   Exception in Tkinter callback
   Traceback (most recent call last):
    File "C:\Users\Admin\Python3.9\lib\tkinter\__init__.py", line 1892, in __call__
    return self.func(*args)
    File "C:\Users\Admin\PycharmProjects\pythonProject\Calculator GUI v1.0.py", line 32, in 
    button_subtract
     e.insert(0, f_num + int(second_number))
    NameError: name 'f_num' is not defined

   Process finished with exit code 0

我的代码:

import tkinter as Tk
from tkinter import *

root_var = Tk()
root_var.title("Calculator")

e = Entry(root_var, width=25, borderwidth=5)
e.grid(row=0, column=0, columnspan=3, padx=10, pady=10)

def button_click(number=None):

#e.delete(0, END)
current = e.get()
e.delete(0, END)
e.insert(0, str(current) + str(number) )

def button_clear():
e.delete(0, END)


def button_add():
first_number = e.get()
global f_num
f_num = int(first_number)
e.delete(0, END)


def button_subtract():
second_number = e.get()
e.delete(0, END)
e.insert(0, f_num + int(second_number))


def button_multiply():
third_number = e.get()
e.delete(0, END)
e.insert(0, f_num + int(third_number))



def button_divide():
fourth_number = e.get()
e.delete(0, END)
e.insert(0, f_num + int(fourth_number))



def button_exponents():
fifth_number = e.get()
e.delete(0, END)
e.insert(0, f_num + int(fifth_number))

def button_equal():
sixth_number = e.get()
e.delete(0, END)
e.insert(0, f_num + int(sixth_number))

 button_1 = Button(root_var, text="1", padx=50, pady=10, command=lambda: button_click(1))
 button_2 = Button(root_var, text="2", padx=50, pady=10, command=lambda: button_click(2))
 button_3 = Button(root_var, text="3", padx=50, pady=10, command=lambda: button_click(3))
 button_4 = Button(root_var, text="4", padx=50, pady=10, command=lambda: button_click(4))
 button_5 = Button(root_var, text="5", padx=50, pady=10, command=lambda: button_click(5))
 button_6 = Button(root_var, text="6", padx=50, pady=10, command=lambda: button_click(6))
 button_7 = Button(root_var, text="7", padx=50, pady=10, command=lambda: button_click(7))
 button_8 = Button(root_var, text="8", padx=50, pady=10, command=lambda: button_click(8))
 button_9 = Button(root_var, text="9", padx=50, pady=10, command=lambda: button_click(9))
 button_0 = Button(root_var, text="0", padx=50, pady=10, command=lambda: button_click(0))

 button_addition = Button(root_var, text="+", padx=50, pady=10, command=button_add)
 button_subtraction = Button(root_var, text="-", padx=50, pady=10, command=button_subtract)
 button_multiplication = Button(root_var, text="*", padx=50, pady=10, command=button_multiply)
 button_division = Button(root_var, text="/", padx=50, pady=10, command=button_divide)
 button_exponents = Button(root_var, text="^", padx=50, pady=10, command=button_exponents)

 button_equals = Button(root_var, text="=", padx=50, pady=10, command=button_equal)

 button_clear = Button(root_var, text="C", padx=50, pady=10, command=button_clear)

  button_1.grid(row=3, column=2)
  button_2.grid(row=3, column=1)
  button_3.grid(row=3, column=0)

  button_4.grid(row=2, column=2)
  button_5.grid(row=2, column=1)
  button_6.grid(row=2, column=0)

  button_7.grid(row=1, column=2)
  button_8.grid(row=1, column=1)
  button_9.grid(row=1, column=0)

  button_0.grid(row=4, column=0)
  button_addition.grid(row=4, column=1)
  button_subtraction.grid(row=4, column=2)

  button_multiplication.grid(row=5, column=0)
  button_division.grid(row=5, column=1)
  button_exponents.grid(row=5, column=2)

  button_equals.grid(row=6, column=0)
  button_clear.grid(row=6, column=1)


  root_var.mainloop()

加法操作有效。我希望其他操作也能够执行各自的任务。

【问题讨论】:

  • 您发布的代码没有正确缩进,因此没有意义。
  • 您在函数button_add() 中定义变量f_num。所以它只有在你第一次调用这个函数时才被定义。也许尝试在其他地方定义f_num
  • 你在函数中本地引用f_num。要么将其设为全局变量(不推荐),要么将其作为参数传递
  • @PCM 拥有一个全局变量并不是那么糟糕,而且没有办法将它作为参数传递。只有当您不记得它们的名称/它们所持有的内容时,拥有全局变量才是一个问题。
  • 即使您可以修复f_num 问题,这些函数内部的乘法、除法、减法和指数运算的逻辑也不正确。

标签: python-3.x user-interface tkinter calculator nameerror


【解决方案1】:

当点击其中一个运算符时,需要将当前输入的数字保存到f_num,将运算符保存到另一个变量,例如opr

然后当点击=时,根据保存的oprf_num和当前输入值进行计算。

以下是基于您的代码的示例:

from tkinter import *

root_var = Tk()
root_var.title("Calculator")

e = Entry(root_var, width=25, borderwidth=5)
e.grid(row=0, column=0, columnspan=3, padx=10, pady=10)

f_num = opr = None

def button_click(number=None):
    current = e.get()
    e.delete(0, END)
    e.insert(0, current+str(number))

def button_opr(op):
    global f_num, opr
    # save the first number and operator
    try:
        f_num = int(e.get())
        opr = op
        # clear the entry
        e.delete(0, END)
    except Exception as ex:
        print(ex)

def button_clear():
    global f_num, opr
    e.delete(0, END)
    # reset first number and operator
    f_num = opr = None

def button_equal():
    global f_num, opr
    if f_num and opr:
        try:
            current = int(e.get())
            e.delete(0, END)
            if opr == "+":
                e.insert(0, f_num+current)
            elif opr == "-":
                e.insert(0, f_num-current)
            elif opr == "*":
                e.insert(0, f_num*current)
            elif opr == "/":
                e.insert(0, f_num/current)
            elif opr == "^":
                e.insert(0, f_num**current)
        except Exception as ex:
            print(ex)
    # reset first number and operator
    f_num = opr = None

button_1 = Button(root_var, text="1", padx=50, pady=10, command=lambda: button_click(1))
button_2 = Button(root_var, text="2", padx=50, pady=10, command=lambda: button_click(2))
button_3 = Button(root_var, text="3", padx=50, pady=10, command=lambda: button_click(3))
button_4 = Button(root_var, text="4", padx=50, pady=10, command=lambda: button_click(4))
button_5 = Button(root_var, text="5", padx=50, pady=10, command=lambda: button_click(5))
button_6 = Button(root_var, text="6", padx=50, pady=10, command=lambda: button_click(6))
button_7 = Button(root_var, text="7", padx=50, pady=10, command=lambda: button_click(7))
button_8 = Button(root_var, text="8", padx=50, pady=10, command=lambda: button_click(8))
button_9 = Button(root_var, text="9", padx=50, pady=10, command=lambda: button_click(9))
button_0 = Button(root_var, text="0", padx=50, pady=10, command=lambda: button_click(0))

button_addition = Button(root_var, text="+", padx=50, pady=10, command=lambda: button_opr("+"))
button_subtraction = Button(root_var, text="-", padx=50, pady=10, command=lambda: button_opr("-"))
button_multiplication = Button(root_var, text="*", padx=50, pady=10, command=lambda: button_opr("*"))
button_division = Button(root_var, text="/", padx=50, pady=10, command=lambda: button_opr("/"))
button_exponents = Button(root_var, text="^", padx=50, pady=10, command=lambda: button_opr("^"))
button_equals = Button(root_var, text="=", padx=50, pady=10, command=button_equal)
button_clear = Button(root_var, text="C", padx=50, pady=10, command=button_clear)

button_1.grid(row=3, column=2, sticky="ew")
button_2.grid(row=3, column=1, sticky="ew")
button_3.grid(row=3, column=0, sticky="ew")
button_4.grid(row=2, column=2, sticky="ew")
button_5.grid(row=2, column=1, sticky="ew")
button_6.grid(row=2, column=0, sticky="ew")
button_7.grid(row=1, column=2, sticky="ew")
button_8.grid(row=1, column=1, sticky="ew")
button_9.grid(row=1, column=0, sticky="ew")
button_0.grid(row=4, column=0, sticky="ew")

button_addition.grid(row=4, column=1, sticky="ew")
button_subtraction.grid(row=4, column=2, sticky="ew")
button_multiplication.grid(row=5, column=0, sticky="ew")
button_division.grid(row=5, column=1, sticky="ew")
button_exponents.grid(row=5, column=2, sticky="ew")
button_equals.grid(row=6, column=0, sticky="ew")
button_clear.grid(row=6, column=1, sticky="ew")

root_var.mainloop()

【讨论】:

    【解决方案2】:

    您可以创建一个类,然后将所有函数放入该类并将 f_num 声明为 self.f_num。

    如果你不知道如何使用类,你也可以尝试这样的事情:

    f_num = 0
    
    def button_add():
        global f_num
        first_number = 10
        f_num = first_number
        
    
    
    def button_subtract():
        global f_num
        second_number = 20
        print(f_num + second_number)
    
    button_add()
    button_subtract()
    
    print(f_num)
    

    在函数外部声明f_num,然后在函数内部对 f_num执行所有操作。 (添加global否则f_num的值不会改变)

    【讨论】:

    • 看起来 OP 正在使用函数式编程。他们甚至可能不知道什么是类。如果是这样的话,这个答案对他们来说毫无用处。
    • @Yoshikaga Kira 您的代码是否有助于使其余 4 个操作员工作?因为我的目标是消除该错误并使操作员表现良好。
    • @Yoshikaga Kira 根据我从您的回答中了解到的情况,您希望我将 f_num 设为一个类。对吗?
    • 不行,你需要创建一个类,放入__init__(self) f_num。你也可以使用我在这里写的代码。如果您不知道如何声明/使用类,请阅读此文档:docs.python.org/3/tutorial/classes.html
    猜你喜欢
    • 2020-04-20
    • 2021-08-23
    • 2021-09-16
    • 2016-12-20
    • 2023-03-05
    • 2020-12-23
    • 2014-03-18
    • 2021-07-27
    • 1970-01-01
    相关资源
    最近更新 更多