python tkinter, 通过lambda表达式传递参数到按钮的点击事件函数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python tkinter, 通过lambda表达式传递参数到按钮的点击事件函数相关的知识,希望对你有一定的参考价值。

参考技术A 给tkinter的按钮添加点击事件处理函数,可以在创建按钮时将定义好的函数赋值给它的command属性,即

如果在点击按钮执行函数时还要传递参数,就要用到lambda了,写成以下形式

写一个完整的小例子,来计算c = a + b

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

【中文标题】Tkinter Python程序中函数参数的名称错误【英文标题】:Name Error for function argument in Tkinter Python Program 【发布时间】:2021-08-05 11:07:15 【问题描述】:

我正在尝试为我的代码构建一个 Tkinter GUI,它在给定一个 数量。我为我的代码使用了 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()

【问题讨论】:

解决方法只需将stack = [] 放在函数之外 【参考方案1】:

简单地说解决

stack = []

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

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

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

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

还有一个更大的问题是,虽然它不会抛出任何错误,因为它可以工作,但它不会做任何事情,因为如果在 command 中使用该函数,从函数返回值是毫无意义的Button 的参数,因为您无法获取该返回值。

【讨论】:

非常感谢您的成功!我还使用了 print 语句而不是 return 并输出了我想要的结果。【参考方案2】:

问题是这一行,

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

栈变量没有定义,但是在你的函数print中(警告,print是python内置的函数,不要使用这个函数名)。

编辑:

return stack.append(...)

返回值为None

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

在你的解释器 python 中测试。

【讨论】:

这不是一个答案,您只是陈述了 OP 在没有解决问题的情况下已经知道的事情(除了我同意不应该使用的打印件并返回东西但不是真的因为它实际上只是执行附加部分,然后停止函数,这样也没有错) @Fred 感谢您更改我的函数名称的建议!

以上是关于python tkinter, 通过lambda表达式传递参数到按钮的点击事件函数的主要内容,如果未能解决你的问题,请参考以下文章

Tkinter lambda 函数

Tkinter Button按钮组件如何调用一个可以传入参数的函数

tkinter 按钮回调中的 Lambda 函数

python python表tkinter

Tkinter 在循环中使用 lambda 分配按钮命令

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