BoobaGump
BoobaGump

Reputation: 535

Using the lambda function in 'command = ' from Tkinter.

This is a very easy code to understand things :

Main :

import pdb
#pdb.set_trace()
import sys
import csv
sys.version_info
  
if sys.version_info[0] < 3:
  from Tkinter import *
else:
  from tkinter import *


from Untitled import *

main_window =Tk()
main_window.title("Welcome")


label = Label(main_window, text="Enter your current weight")
label.pack()
Current_Weight=StringVar()
Current_Weight.set("0.0")
entree1 = Entry(main_window,textvariable=Current_Weight,width=30)
entree1.pack()
bouton1 = Button(main_window, text="Enter", command= lambda evt,Current_Weight,entree1: get(evt,Current_Weight,entree1))
bouton1.pack()

and in another file Untitled i have the "get" function :

def get (event,loot, entree):
    loot=float(entree.get())
    print(loot)

When i run the main i receive the following error :

Exception in Tkinter callback Traceback (most recent call last): File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/idlelib/run.py", line 121, in main seq, request = rpc.request_queue.get(block=True, timeout=0.05) File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/queue.py", line 175, in get raise Empty queue.Empty

During handling of the above exception, another exception occurred:

Traceback (most recent call last): File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/tkinter/init.py", line 1533, in call return self.func(*args) TypeError: () missing 3 required positional arguments: 'evt', 'Current_Weight', and 'entree1'

How can i solve that ?

I thought the lambda function allows us to uses some args in a event-dependant function.

Upvotes: 5

Views: 30931

Answers (2)

Leon Chang
Leon Chang

Reputation: 681

Actually, you just need the Entry object entree1 as the lamda pass-in argument. Either statement below would work.

bouton1 = Button(main_window, text="Enter", command=lambda x = entree1: get(x))
bouton1 = Button(main_window, text="Enter", command=lambda : get(entree1))

with the function get defined as

def get(entree):
    print(float(entree.get()))

Upvotes: 0

The command lambda does not take any arguments at all; furthermore there is no evt that you can catch. A lambda can refer to variables outside it; this is called a closure. Thus your button code should be:

bouton1 = Button(main_window, text="Enter",
    command = lambda: get(Current_Weight, entree1))

And your get should say:

def get(loot, entree):
    loot = float(entree.get())
    print(loot)

Upvotes: 9

Related Questions