簡體   English   中英

如何在tkinter python中的按鈕小部件的command屬性中使用lambda表達式調用回調函數

[英]How to call a callback function using lambda expression in button widget's command attribute in tkinter python

我已經使用tkinter創建了一個gui,在其中我創建了一個帶有Toplevel小部件的新窗口,並將小部件添加到該窗口中,例如輸入框,標簽和按鈕小部件。 按鈕窗口小部件的command屬性使用lambda表達式調用回調函數,以便gui在執行此回調函數之前一定不能繼續進行。 但是,由於某些問題,當我按下按鈕小部件時,未調用回調函數。

def toplevel_widget(obj):
    def suppress():
        try:
            if obj.fillna_value.get():
                fill_na_value_window.withdraw()
            else:
                raise Empty_na_value_entry_Error("The textbox can't be left empty!!\nFill any data in it.")
        except Empty_na_value_entry_Error as e:
            msgbox.showerror("Error",e.msg)

    fill_na_value_window=tk.Toplevel(obj)
    obj.fillna_value=tk.StringVar()
    tk.ttk.Label(fill_na_value_window,text="Enter the value to be inserted").grid(row=1,column=0,padx=10,pady=10)
    tk.ttk.Entry(fill_na_value_window,textvariable=obj.fillna_value,width=15).grid(row=1,column=1,padx=10,pady=10)
    tk.ttk.Button(fill_na_value_window,text="Ok",command=lambda : suppress,width=10).grid(row=2,columnspan=2)


    Cleanser_manual.fillna_toplevel_widget(obj)
    val=obj.fillna_value.get()
    print("Value : ",val)  #here **Value :    is printed on screen**

在這里,即使單擊按鈕,也不會調用prevent()函數

您沒有在lambda函數中調用supress,您錯過了括號

(..., command=lambda: supress(), ...)

無論如何,您根本不需要lambda,您可以將supress函數作為參數傳遞

(..., command=supress, ...)

擴展@ angeldeluz777的答案:

您想要做的是將對回調函數的引用作為command參數傳遞給Button 但是, command=lambda : suppress實際上是在傳遞一個lambda函數,該函數除了返回對回調函數的引用外什么也不做,這就是為什么單擊按鈕沒有效果的原因。

從以下位置更改代碼:

 tk.ttk.Button(fill_na_value_window,text="Ok",command=lambda : suppress,width=10).grid(row=2,columnspan=2)

至:

 tk.ttk.Button(fill_na_value_window,text="Ok",command=suppress,width=10).grid(row=2,columnspan=2)

這可能有助於說明發生了什么:

Python 3.6.7 (default, Oct 22 2018, 11:32:17)
[GCC 8.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> def f():
...     print("Hello")
...
>>> callback = f
>>> callback()
Hello
>>> callback2 = lambda: f
>>> callback2()
<function f at 0x7fafacc10c80>
>>>

正如@ juanpa.arrivillaga所說。

tk.ttk.Button(fill_na_value_window,text="Ok",command=suppress,width=10).grid(row=2,columnspan=2)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM