Tkinter/Python:努力通过 Entry.bind() 方法传递参数

Tkinter/Python: Struggling to pass a argument through Entry.bind() method

我是 运行 一段简单的代码,它创建了一个小的 tk inter form/window 要求用户输入客户的联系电话,我计划稍后使用它来搜索客户数据库的详细信息(除此之外)

我已经使用 .bind() 方法来跟踪用户何时按回车键接受数字输入,但是为了我的爱,我似乎无法将参数传递给回调函数。

我的代码如下:任何人都可以告诉我我可能做错了什么(这个当前代码如果在我尝试各种修复尝试后是最新版本)

import tkinter as tk

def ClientNumberRequest():

   def SearchForClient(event, fun_client_num):
       search_numb = fun_client_num.get()
       # Do some stuff with the search number
    
   client_num_window = tk.Tk()
   form_label = tk.Label(client_num_window, text="Please enter the client's 
                         contact number")
   form_label.grid(row=0, column=0)
   client_num = tk.StringVar()
   form_entry = tk.Entry(client_num_window, textvariable=client_num)
   form_entry.grid(row=1, column=0)
   form_entry.focus_set()
   form_entry.bind("<Return>", lambda event, client_num: 
                  SearchForClient(event, client_num))

我得到的错误只有在我点击 enter/return 之后 运行 程序

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Users826\AppData\Local\Programs\Python\Python39\lib\tkinter\__init__.py", line 1884, in __call__

    return self.func(*args)
TypeError: <lambda>() missing 1 required positional argument: 'client_num'

通过事件调用的函数必须接受一个位置参数,该参数将传递一个事件对象。如果你想让它接受其他参数,它们必须是关键字参数。

您需要将 lambda 重新定义为如下所示:

form_entry.bind("<Return>", lambda event, client_num=client_num: 
               SearchForClient(event, client_num))

但是,如果您只是为了获取值而使用该参数,则不需要它,因为事件对象具有对小部件的引用并且小部件具有 get 方法:

def SearchForClient(event):
   search_numb = event.widget.get()

form_entry.bind("<Return>", SearchForClient)