一直不太了解Python中lambda函数的作用。最近要获取Tkinter中的输入数据,发现了lambda的一个妙用。
我用Tkinter来生成一个GUI界面。在其中的Text控件中输入数据,点击Send按钮后,获取输入数据到一个deque中。界面如下:
在createWidgets函数中生成TextBox跟Send按钮:
def createWidgets(self):
self.msgBox = tk.Text(self)
self.msgBox.grid(row=0)
self.sendButton = tk.Button(self, text='Send')
self.sendButton.grid(row=1)
我想通过点击Send按钮去触发文本框的取值,并放到一个deque中。于是写了一个取值函数,并意图bind到send按钮上的单击事件。
def sendButtonAction(self, event, msgQueue):
msg = self.msgBox.get("1.0", 'end-1c')
msgQueue.append(msg)
在绑定到Send按钮的时候遇到问题, 因为bind函数只接受方法类型的参数,如何将msgQueue这个参数传入sendButtonAction函数?一般使用bind(eventDescription, functionName)
这样的格式。如果用第二个参数写成functionName(parameters)
那么调用的就不是一个方法了,而是方法的执行结果。
幸好有lambda表达式,因为它实现的是一个方法。所以在createWidgets函数中这样实现bind。
self.sendButton.bind('<Button-1>', lambda event, msgQueue=self.msgQueue: self.sendButtonAction(event, msgQueue))
通过这个实现加深了对lambda的了解。相信后面的开发过程中还会用到这个神奇的表达式。