You’re not passing a function the way you’re doing.
Instead, you are running the function callbackInsereCritico
and passing the return value to the attribute command
. That’s why it’s running without the click event.
Imagine you have this function:
def fazalgo():
return "fizalgo"
If you run:
type(fazalgo)
The comeback will be:
<type 'function'>
Now, if you execute:
type(fazalgo())
The comeback will be:
<type 'str'>
Did you notice the difference? In the first case, the function type
received as parameter a function, already in the second, received the return of the function.
Now, as you need to pass an argument to the function, you can’t just do: command = callbackInsereCritico
.
Has a pythonic way of doing that:
command = lambda: callbackInsereCritico(texto9.get())
lambda
in Python is nothing more than an elegant way of declaring functions. They are very useful for certain moments, such as this.
So your code stays:
def callbackInsereCritico(nome):
conn = psycopg2.connect(host='localhost',
database='diet+',
user='postgres',
password='teste')
cur = conn.cursor()
curCritics = conn.cursor()
cur.execute("INSERT INTO critico (nome) VALUES ('" + nome + "')")
conn.commit()
rotuloAv = Label(formulario, text = "Cadastro do Avaliador")
rotuloNm = Label(formulario, text = "Nome:")
texto9 = Entry(formulario)
botaoAv = Button(formulario, text = "Cadastrar", command = lambda: callbackInsereCritico(texto9.get()))
resultadoAv = Label(formulario, text = None)
How to explain lambda here departs from the scope of the question, I leave here this link:
http://blog.alienretro.com/entendendo-python-lambda/
Hello, thank you for the answer! I believe I understood the functionality of lambda, but if I leave as you posted, it simply does not perform the function
– Állan Coinaski
Are you sure? Debugged? Some mistake or strange behavior?
– Max Fratane
Gave it right, did not run for a syntax error elsewhere in the code. So using lambda, solved the problem! Thank you very much beast!
– Állan Coinaski