欢迎各位兄弟 发布技术文章
这里的技术是共享的
这里为什么 不能直接使用 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")
这里发生了什么:
lambda
表达式:定义了一个匿名函数,这个函数在被调用时会执行 button_click("按钮1")
。
延迟调用:只有在按钮被点击时,这个 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()