5

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.

2 Answers 2

9

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)
Sign up to request clarification or add additional context in comments.

Comments

0

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()))

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.