我想了解按鈕是如何使用 lambda 作業的。我有以下 Python 代碼:
from tkinter import *
def comando_click(mensagem):
print(mensagem)
menu_inicial = Tk()
menu_inicial.geometry("500x250 200 200")
botao = Button(menu_inicial, text = "Executar", command=comando_click("Nova_Mensagem"))
botao.pack()
menu_inicial.mainloop()
但是當我點擊它時我的按鈕不起作用,當我運行代碼時它只在控制臺中顯示一次列印,我在問題中添加了一些列印:
問題圖一
好吧,當我在按鈕中使用 Lambda 函式時,它似乎起作用了,我真的很想知道為什么。
Lambda 作業按鈕 圖一
我剛剛在按鈕上添加了 lambda :
botao = Button(menu_inicial, text = "Executar", command=lambda:comando_click("Nova_Mensagem"))
Lambda 作業按鈕 圖二
為什么用 lambda 它有效?沒有 lambda 它也不應該作業,因為 lambda 基本上是一個匿名函式?
我非常想知道它為什么起作用,謝謝大家的幫助:)
uj5u.com熱心網友回復:
在這段代碼中:
command=comando_click("Nova_Mensagem")
您已經呼叫了該comando_click函式一次,并將結果 ( None)分配給了command引數。當command被呼叫時什么都不會發生(實際上你應該得到一個TypeError例外,因為它None是不可呼叫的)。
在這段代碼中:
command=lambda:comando_click("Nova_Mensagem")
您實際上還沒有呼叫comando_click——您已經創建了一個新函式(使用lambda),該函式將在被呼叫comando_click時呼叫。每次單擊按鈕時,您的新函式都會被呼叫。
如果lambda令人困惑,你可以用這樣的方式做同樣的事情def:
def button_command():
comando_click("Nova_Mensagem")
...
command=button_command # no ()! we don't want to actually call it yet!
當您想創建一個不需要名稱的小型一次性函式時,該lambda運算式只是 using 的替代方法def(例如,您想創建一個函式,該函式使用特定引數呼叫另一個函式,正如您在此處所做的那樣) )。
uj5u.com熱心網友回復:
問題是comando_click("Nova_Mensagem")您正在執行該功能。所以命令=無。
在第二種情況下lambda:comando_click("Nova_Mensagem")回傳一個 lambda,它在內部呼叫comando_click("Nova_Mensagem").
修復:只需將command=comando_click.
如果你想用引數個性化 lambda,你可以這樣寫:
def handler(args):
def custom_handler():
print(args)
return custom_handler
botao = Button(menu_inicial, text = "Executar", command=handler("my custom string"))
uj5u.com熱心網友回復:
當您使用()函式名稱(func(args))時,它會在 python 執行該行時立即呼叫/呼叫該函式,您不希望那樣。您只想在單擊按鈕時呼叫該函式。tkinter將在內部為您呼叫該函式,您所要做的就是給出函式名稱。
為什么使用lambda?將其視為回傳另一個函式的函式,您的代碼可以延長為:
func = lambda: comando_click("Nova_Mensagem")
botao = Button(menu_inicial, text = "Executar", command=func)
func是函式名,如果你想呼叫它,你會說func(). 當你說command=comando_click("Nova_Mensagem")then commandhas the value 回傳時command click(因為你用 呼叫函式()),None如果我沒有錯,如果給定的值是None,它不會被呼叫tkinter。因此,您的函式只執行一次,因為()呼叫該函式的結果是None在事件回圈開始處理事件之前分配函式 call( )的值。
其他一些方法:
- 使用
partial來自functools:
from functools import partial
botao = Button(.....,command=partial(comando_click,"Nova_Mensagem"))
- 使用輔助函式:
def helper(args):
def comando_click():
print(args)
return comando_click
botao = Button(...., command=helper("Nova_Mensagem"))
IMO, lambdas 是繼續呼叫帶引數函式的最簡單方法。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/385736.html
標籤:Python 蟒蛇-3.x 特金特 传统知识 tkinter-button
上一篇:如何使用Selenium從文本檔案中一次打開一個URL?
下一篇:在Windows之間傳遞資料
