Re: [Python] Button all'interno di un for

2016-11-28 Per discussione Strap Lab
2016-11-25 18:29 GMT+01:00 Michele TOMAIUOLO :

> Ottimo!
>
>
> In ogni caso, aggiungere alle lambda parametri con valori di default è una
> tecnica ben nota ;-)
>
>
> http://www.pythondoeswhat.com/2012/11/lambda-default-parameters.html
>
>
> https://docs.python.org/3/faq/programming.html#why-do-
> lambdas-defined-in-a-loop-with-different-values-all-return-the-same-result
>
> Strano che non funzioni... Ho eseguito il codice con Python 2.7 e 3.5
> senza problemi.
>
>
Si` non funzionava perche` mi mancava un pezzo :-)
Non avevo notato il `n=numero` nella lambda, che e` la chiave della closure.
Quindi, bravo, bella soluzione, non ci avevo pensato :-)

Ho trovato tra i miei link
http://www.datadependence.com/2016/04/how-to-build-gui-in-python-3/ giusto
per avere un approccio object oriented e - dipende dal contesto - piu`
ordinato.

Sani
Strap
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Button all'interno di un for

2016-11-25 Per discussione Michele TOMAIUOLO
Ottimo!


In ogni caso, aggiungere alle lambda parametri con valori di default è una 
tecnica ben nota ;-)


http://www.pythondoeswhat.com/2012/11/lambda-default-parameters.html


https://docs.python.org/3/faq/programming.html#why-do-lambdas-defined-in-a-loop-with-different-values-all-return-the-same-result

Strano che non funzioni... Ho eseguito il codice con Python 2.7 e 3.5 senza 
problemi.

--
Mic
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Button all'interno di un for

2016-11-25 Per discussione Marcello
Il giorno 25 novembre 2016 16:40, Strap Lab  ha scritto:
>
> Cosi` facendo viene creata e riservata una referenza corretta al numero
> per la callback assegnata a command.
>



Si, grazie 1000,
funziona, inserisco il codice completo

Ciao



from Tkinter import *
root= Tk()
def premuto (numero):
print ("premuto bottone ",numero)
#root.destroy()
def factory_btn(numero):
pulsante = Button(finestra)
pulsante["text"] = "pulsante"
pulsante["background"] = "black"
pulsante["command"] = lambda: premuto(numero)
pulsante["fg"] = "red"
pulsante.pack()

finestra = Frame(root)
finestra.pack()
for numero in range(1,7):
factory_btn(numero)
root.mainloop()
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Button all'interno di un for

2016-11-25 Per discussione Strap Lab
2016-11-25 16:40 GMT+01:00 Michele TOMAIUOLO :

> Ciao, Marcello.
>
> Credo tu debba usare questo codice:
>
>  lambda n=numero: premuto(n)
>
>
In questo modo, il valore di numero viene assegnato come default al
> parametro n.
> Altrimenti, prendi direttamente in closure la variabile, che poi muta
> valore...
>


Non funziona, la lambda dovrebbe accettare un parametro che non viene
passato, infatti si ha un:

TypeError: () takes exactly 1 argument (0 given)


> Approfitto per salutare tutta la lista, su cui finora ho solo origliato
> con molto interesse :-)
>

Siamo in due! :-)

Sani
Strap
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Button all'interno di un for

2016-11-25 Per discussione Strap Lab
2016-11-25 15:20 GMT+01:00 Marcello :

> Ciao a tutti,
> ho un problemino con Tkinter Button,
> devo creare una finestra con svariati bottoni che mi andranno ad eseguite
> dei comandi batch.
> Per la creazione dei pulsati pensavo di utilizzare un ciclo for. Il
> problema è che qualsiasi bottone io prema e come se  premessi l'ultimo.
> Dove sbaglio? I bottoni li ho creati tutti con nomi diversi.
> Grazie per l'aiuto
>
> Marcello
>
> --
> from Tkinter import *
> root= Tk()
> def premuto (numero):
> print ("premuto bottone ",numero)
> #root.destroy()
>
> finestra = Frame(root)
> finestra.pack()
> for numero in range(1,7):
> pulsante = "pulsante" + str(numero)
> pulsante = Button(finestra)
> pulsante["text"] = "pulsante"
> pulsante["background"] = "black"
> pulsante["command"] = lambda: premuto(numero)
> pulsante["fg"] = "red"
> pulsante.pack()
> root.mainloop()
> --
>
>
Ciao,

il problema sta nella variabile "numero" perche` e` il valore che viene
assegnato durante il for e l'interprete mantiene quello per la durata del
tuo programma:

>>> for x in range(1, 3):
... print(x)
...
1
2
>>> print(x)
2
>>>

Una possibile soluzione e` quella di creare un factory builder per i tuoi
bottoni:

from Tkinter import *
root= Tk()

def premuto (numero):
print ("premuto bottone ",numero)
#root.destroy()

def factory_btn(num):
Button(finestra, text="pulsante {}".format(numero), background="black",
command=lambda: premuto(num), fg="red").pack()

finestra = Frame(root)
finestra.pack()
for numero in range(1,3):
factory_btn(numero)

root.mainloop()

Cosi` facendo viene creata e riservata una referenza corretta al numero per
la callback assegnata a command.
Ho utilizzato il costruttore direttamente, ma seguendo il tuo codice
possiamo scrivere cosi` la funzione factory_btn:

def factory_btn(num):
pulsante = Button(finestra)
pulsante["text"] = "pulsante"
pulsante["background"] = "black"
pulsante["command"] = lambda: premuto(num)
pulsante["fg"] = "red"
pulsante.pack()


Sani
Strap
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Button all'interno di un for

2016-11-25 Per discussione Michele TOMAIUOLO
Ciao, Marcello.

Credo tu debba usare questo codice:

 lambda n=numero: premuto(n)

In questo modo, il valore di numero viene assegnato come default al parametro n.
Altrimenti, prendi direttamente in closure la variabile, che poi muta valore...

Approfitto per salutare tutta la lista, su cui finora ho solo origliato con 
molto interesse :-)
Mic
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python