欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

这里为什么 不能直接使用 command=button_click("按钮1")) command=button_click("按钮1")) command=button_click("按钮1")) 为什么非要加个 lambda: AG chatgpt 有大用

#!/usr/bin/python3
import tkinter as tk

# 创建主窗口
root = tk.Tk()
root.title("竖着排列的按钮")

# 设置窗口大小(可选)
root.geometry("200x200")

# 定义按钮函数(这里只是简单的打印,实际中可以替换为需要的操作)
def button_click(button_text):
    print(f"Button '{button_text}' clicked!")

# 创建并放置按钮
button1 = tk.Button(root, text="按钮1", command=lambda: button_click("按钮1"))
button1.grid(row=0, column=0, padx=10, pady=10)  # 第一个按钮在第一行

button2 = tk.Button(root, text="按钮2", command=lambda: button_click("按钮2"))
button2.grid(row=1, column=0, padx=10, pady=10)  # 第二个按钮在第二行

button3 = tk.Button(root, text="按钮3", command=lambda: button_click("按钮3"))
button3.grid(row=2, column=0, padx=10, pady=10)  # 第三个按钮在第三行

# 启动Tkinter事件循环
root.mainloop()


这里为什么 不能直接使用  command=button_click("按钮1")) command=button_click("按钮1")) command=button_click("按钮1")) 为什么非要加个 lambda:



在 Tkinter 中,command 参数用于指定按钮被点击时要调用的函数。您提到的 command=button_click("按钮1") 的写法实际上会在创建按钮的时候立即调用 button_click 函数,而不是在按钮实际被点击时再调用它。这就是为什么需要使用 lambda 的原因。

让我们详细了解一下这个机制:

没有 lambda 的情况下

当你写:

python

command=button_click("按钮1")    


这会在创建按钮时立即执行 button_click("按钮1"),并将返回值(如果有的话)赋予 command。由于 button_click 函数没有返回值(返回 None),按钮实际上并不会具有执行任何操作的功能。

使用 lambda

如果你写:

python

command=lambda: button_click("按钮1")    


这里发生了什么:

  1. lambda 表达式:定义了一个匿名函数,这个函数在被调用时会执行 button_click("按钮1")

  2. 延迟调用:只有在按钮被点击时,这个 lambda 才会被执行,从而调用 button_click 函数。

例子总结

  • 没有 lambda:按钮创建时,立即调用 button_click 函数。

  • 有 lambda:只在按钮点击时调用 button_click 函数。

小结

  • 使用 command=button_click("按钮1") 会导致您在创建按钮时触发 button_click,而不是等待用户点击按钮。

  • 使用 command=lambda: button_click("按钮1") 可以有效地将函数的调用延迟到事件发生时(按钮点击时),这是在处理回调时的标准做法。

因此,在需要将一个函数作为回调传递给 Tkinter 组件时,通常会使用 lambda 或其他方法来包裹函数调用,以确保它在适当的时机执行。



#!/usr/bin/python3
import tkinter as tk

# 创建主窗口
root = tk.Tk()
root.title("竖着排列的按钮")

# 设置窗口大小(可选)
root.geometry("200x200")

# 定义按钮函数(这里只是简单的打印,实际中可以替换为需要的操作)
def button_click(button_text):
print(f"Button '{button_text}' clicked!")
def button_click_1():
print("按钮1")
# 创建并放置按钮
button1 = tk.Button(root, text="按钮1", command=button_click_1) #这里是引用 button_click_1 后面不能加括号(),,,, 不能用方法调用 button_click_1()    
button1.grid(row=0, column=0, padx=10, pady=10) # 第一个按钮在第一行

button2 = tk.Button(root, text="按钮2", command=lambda: button_click("按钮2"))
button2.grid(row=1, column=0, padx=10, pady=10) # 第二个按钮在第二行

button3 = tk.Button(root, text="按钮3", command=lambda: button_click("按钮3"))
button3.grid(row=2, column=0, padx=10, pady=10) # 第三个按钮在第三行

# 启动Tkinter事件循环
root.mainloop()


普通分类: