Tkinter Python 程序中函数参数的名称错误

Name Error for function argument in Tkinter Python Program

我正在尝试为我的代码构建一个 Tkinter GUI,returns 给定一个所需的最少硬币数量 数量。我为我的代码使用了 lambda 函数,因为我知道你不能用 Tkinter 传递参数。

我提前为长代码的家伙道歉。我花了好几个小时研究它,却找不到如何修复它。我很感激你能给我的任何帮助或建议。

这是我收到的错误,然后是我的代码:

NameError: name 'stack' is not defined
import tkinter as tk
from tkinter import *
from functools import partial




#Given a number of cents, return the least number of coins that sums to that amount



def solve(cents):
    stack = []
    result = 0
    quarter = 25
    dime = 10
    nickel = 5
    penny = 1
    difference = abs(cents - result)
    
    if cents == 25:
            result += quarter
            return stack.append("25")
    if cents == 10:
            result += dime
            return stack.append("10")
    if cents == 5:
            result += nickel
            return stack.append("5")
    if cents == 1:
            result += penny
            return stack.append("1")
            
    while cents != result:
        
        while difference >= quarter:
                result += quarter
                stack.append("25")
                difference = abs(cents - result)

            
        while difference >= dime and difference < quarter:
            result += dime
            stack.append("10")
            difference = abs(cents - result)

            
        while difference >= nickel and difference < dime:
            result += nickel
            stack.append("5")
            difference = abs(cents - result)

            
        while difference >= penny and difference < nickel:
            result += penny
            stack.append("1")
            difference = abs(cents - result)
            
        newResult = print(stack)
        return newResult
def print(stack):       
    Quarter = 0
    Dime = 0
    Nickel = 0
    Penny = 0
    for num in stack:
        if num == "1":
            Penny += 1
        elif num == "5":
            Nickel += 1
        elif num == "10":
            Dime += 1
        elif num == "25":
            Quarter += 1
    return f"Minimum coins required are: {Quarter} Quarters, {Dime} Dimes, {Nickel} Nickels, {Penny} Pennies "
         
    

root = tk.Tk()
root.title('Minimum Coins Needed')
canvas1 = tk.Canvas(root, width = 400, height = 300)
canvas1.pack()

label1 = tk.Label(root, text= "Click Calculate to see the Result")
canvas1.create_window(200, 230, window=label1)

entry1 = tk.Entry (root) 
canvas1.create_window(200, 140, window=entry1)

button1 = tk.Button(text='Calculate',command= lambda: print(stack))
canvas1.create_window(200, 180, window=button1)
button1.pack()



root.mainloop()

问题出在这一行,

button1 = tk.Button(text='Calculate',command= lambda: print(stack))

堆栈变量未定义,但在您的函数打印中(警告,打印是内置函数python,请勿使用此函数名称)。

编辑:

return stack.append(...)

值 return 是 None

>>> s = []
>>> print(s.append("test"))
None

在你的解释器中测试 python。

简单的解决

stack = []

在代码开头某处的函数之外,或者在这种情况下可以这样做:

stack = []
def solve():
    # the rest of the code

问题是你在函数内部定义它,这意味着该变量是该函数的局部变量,因此其他函数无法访问(其他选项是使用 global 我猜,但我不确定如何确切地说,也许这甚至不是这里的方式)

另外正如@Fred 提到的,不要使用 print 作为函数名,因为它已经是内置的。

还有一个更大的问题是,现在虽然它不会抛出任何错误,因为它可以工作,但它不会做任何事情,因为它对 return 来自函数的值毫无意义,如果该函数用于 Button 的 command 参数,因为您无法获得该 returned 值。